r600_shader.c revision fc6caef4cb67fb13642c5ebccee53019d1764df6
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,
83d22a1247d8a709cf433a6dd99b2f87a224c27d88Jerome Glisse			r600_bo_offset(shader->bo) >> 8, 0xFFFFFFFF, shader->bo);
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 */
2201235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (shader->bo == NULL) {
221294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse		shader->bo = r600_bo(rctx->radeon, rshader->bc.ndw * 4, 4096, 0);
2221235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (shader->bo == NULL) {
2231235becaa1cf7e29f580900592563c3329d326deJerome Glisse			return -ENOMEM;
2241235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
225294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse		ptr = r600_bo_map(rctx->radeon, shader->bo, 0, NULL);
2261235becaa1cf7e29f580900592563c3329d326deJerome Glisse		memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * 4);
227294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse		r600_bo_unmap(rctx->radeon, shader->bo);
2281235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
2291235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* build state */
2301235becaa1cf7e29f580900592563c3329d326deJerome Glisse	rshader->flat_shade = rctx->flatshade;
2311235becaa1cf7e29f580900592563c3329d326deJerome Glisse	switch (rshader->processor_type) {
2321235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_VERTEX:
2331235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->family >= CHIP_CEDAR) {
2341235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_vs(ctx, shader);
2351235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
2361235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_vs(ctx, shader);
2371235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
2381235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
2391235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
2401235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->family >= CHIP_CEDAR) {
2411235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_ps(ctx, shader);
2421235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
2431235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_ps(ctx, shader);
2441235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
2451235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
2461235becaa1cf7e29f580900592563c3329d326deJerome Glisse	default:
2471235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return -EINVAL;
2481235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
2491235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_context_pipe_state_set(&rctx->ctx, &shader->rstate);
2501235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return 0;
2511235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
2521235becaa1cf7e29f580900592563c3329d326deJerome Glisse
2531235becaa1cf7e29f580900592563c3329d326deJerome Glissestatic int r600_shader_update(struct pipe_context *ctx, struct r600_pipe_shader *rshader)
2541235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
2551235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
2561235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader *shader = &rshader->shader;
2571235becaa1cf7e29f580900592563c3329d326deJerome Glisse	const struct util_format_description *desc;
2581235becaa1cf7e29f580900592563c3329d326deJerome Glisse	enum pipe_format resource_format[160];
2591235becaa1cf7e29f580900592563c3329d326deJerome Glisse	unsigned i, nresources = 0;
2601235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_bc *bc = &shader->bc;
2611235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_bc_cf *cf;
2621235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_bc_vtx *vtx;
2631235becaa1cf7e29f580900592563c3329d326deJerome Glisse
2641235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (shader->processor_type != TGSI_PROCESSOR_VERTEX)
2651235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return 0;
2666dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie	/* doing a full memcmp fell over the refcount */
2676dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie	if ((rshader->vertex_elements.count == rctx->vertex_elements->count) &&
2686dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie	    (!memcmp(&rshader->vertex_elements.elements, &rctx->vertex_elements->elements, 32 * sizeof(struct pipe_vertex_element)))) {
2691235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return 0;
2701235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
2711235becaa1cf7e29f580900592563c3329d326deJerome Glisse	rshader->vertex_elements = *rctx->vertex_elements;
2721235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (i = 0; i < rctx->vertex_elements->count; i++) {
2731235becaa1cf7e29f580900592563c3329d326deJerome Glisse		resource_format[nresources++] = rctx->vertex_elements->elements[i].src_format;
2741235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
275294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse	r600_bo_reference(rctx->radeon, &rshader->bo, NULL);
2761235becaa1cf7e29f580900592563c3329d326deJerome Glisse	LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) {
2771235becaa1cf7e29f580900592563c3329d326deJerome Glisse		switch (cf->inst) {
2781235becaa1cf7e29f580900592563c3329d326deJerome Glisse		case V_SQ_CF_WORD1_SQ_CF_INST_VTX:
2791235becaa1cf7e29f580900592563c3329d326deJerome Glisse		case V_SQ_CF_WORD1_SQ_CF_INST_VTX_TC:
2801235becaa1cf7e29f580900592563c3329d326deJerome Glisse			LIST_FOR_EACH_ENTRY(vtx, &cf->vtx, list) {
2811235becaa1cf7e29f580900592563c3329d326deJerome Glisse				desc = util_format_description(resource_format[vtx->buffer_id]);
2821235becaa1cf7e29f580900592563c3329d326deJerome Glisse				if (desc == NULL) {
2831235becaa1cf7e29f580900592563c3329d326deJerome Glisse					R600_ERR("unknown format %d\n", resource_format[vtx->buffer_id]);
2841235becaa1cf7e29f580900592563c3329d326deJerome Glisse					return -EINVAL;
2851235becaa1cf7e29f580900592563c3329d326deJerome Glisse				}
2861235becaa1cf7e29f580900592563c3329d326deJerome Glisse				vtx->dst_sel_x = desc->swizzle[0];
2871235becaa1cf7e29f580900592563c3329d326deJerome Glisse				vtx->dst_sel_y = desc->swizzle[1];
2881235becaa1cf7e29f580900592563c3329d326deJerome Glisse				vtx->dst_sel_z = desc->swizzle[2];
2891235becaa1cf7e29f580900592563c3329d326deJerome Glisse				vtx->dst_sel_w = desc->swizzle[3];
2901235becaa1cf7e29f580900592563c3329d326deJerome Glisse			}
2911235becaa1cf7e29f580900592563c3329d326deJerome Glisse			break;
2921235becaa1cf7e29f580900592563c3329d326deJerome Glisse		default:
2931235becaa1cf7e29f580900592563c3329d326deJerome Glisse			break;
2941235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
2951235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
2961235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return r600_bc_build(&shader->bc);
2971235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
2981235becaa1cf7e29f580900592563c3329d326deJerome Glisse
299dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_pipe_shader *shader)
3001235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
3011235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
3021235becaa1cf7e29f580900592563c3329d326deJerome Glisse	int r;
3031235becaa1cf7e29f580900592563c3329d326deJerome Glisse
3041235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (shader == NULL)
3051235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return -EINVAL;
3061235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* there should be enough input */
3071235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (rctx->vertex_elements->count < shader->shader.bc.nresource) {
3081235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("%d resources provided, expecting %d\n",
3091235becaa1cf7e29f580900592563c3329d326deJerome Glisse			rctx->vertex_elements->count, shader->shader.bc.nresource);
3101235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return -EINVAL;
3111235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
3121235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r = r600_shader_update(ctx, shader);
3131235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r)
3141235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
3151235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return r600_pipe_shader(ctx, shader);
3161235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
3171235becaa1cf7e29f580900592563c3329d326deJerome Glisse
3181235becaa1cf7e29f580900592563c3329d326deJerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader);
319dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader, const struct tgsi_token *tokens)
3201235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
3211235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
3221235becaa1cf7e29f580900592563c3329d326deJerome Glisse	int r;
3231235becaa1cf7e29f580900592563c3329d326deJerome Glisse
3241235becaa1cf7e29f580900592563c3329d326deJerome Glisse//fprintf(stderr, "--------------------------------------------------------------\n");
3251235becaa1cf7e29f580900592563c3329d326deJerome Glisse//tgsi_dump(tokens, 0);
3261235becaa1cf7e29f580900592563c3329d326deJerome Glisse	shader->shader.family = r600_get_family(rctx->radeon);
3271235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r = r600_shader_from_tgsi(tokens, &shader->shader);
3281235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
3291235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("translation from TGSI failed !\n");
3301235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
3311235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
3321235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r = r600_bc_build(&shader->shader.bc);
3331235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
3341235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("building bytecode failed !\n");
3351235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
3361235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
3371235becaa1cf7e29f580900592563c3329d326deJerome Glisse//fprintf(stderr, "______________________________________________________________\n");
3381235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return 0;
3391235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
3401235becaa1cf7e29f580900592563c3329d326deJerome Glisse
3411235becaa1cf7e29f580900592563c3329d326deJerome Glisse/*
3421235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader
3431235becaa1cf7e29f580900592563c3329d326deJerome Glisse */
3442b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction;
3452b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
3462b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx {
3472b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_shader_info			info;
3482b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_parse_context		parse;
3492b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	const struct tgsi_token			*tokens;
3502b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				type;
3512b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				file_offset[TGSI_FILE_COUNT];
3522b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				temp_reg;
3532b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
3542b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_bc				*bc;
3552b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader			*shader;
3562b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	u32					value[4];
357cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					*literals;
358cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					nliterals;
359e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe	u32					max_driver_temp_used;
360fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* needed for evergreen interpolation */
361fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_centroid;
362fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_linear;
363fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_perspective;
364fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int					num_interp_gpr;
3652b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
3662b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
3672b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
3682b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
3692b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
3702b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
3712b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
3722b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
3732b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
37450526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[];
37542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
376de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
377de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
378de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
379de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
380de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
381de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
382de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
383de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
384de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
38572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
389c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
390a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
39472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
395a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
3978260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell		if (i->Src[j].Register.Dimension) {
3988260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell			R600_ERR("unsupported src %d (dimension %d)\n", j,
3998260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell				 i->Src[j].Register.Dimension);
400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
40447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
40547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
409de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
41072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
41172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
412fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
41350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
41450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
41550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	struct r600_bc_alu alu;
416fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int gpr = 0, base_chan = 0;
417fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int ij_index = 0;
418fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
419fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
420fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
421fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
422fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
423fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	} else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
424fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
425fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* if we have perspective add one */
426fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->input_perspective)  {
427fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
428fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			/* if we have perspective centroid */
429fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->input_centroid)
430fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				ij_index++;
431fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		}
432fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
433fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
434fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
435fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
436fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* work out gpr and base_chan from index */
437fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	gpr = ij_index / 2;
438fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	base_chan = (2 * (ij_index % 2)) + 1;
43950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
44050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
44150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
44250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
44350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
44450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW;
44550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
44650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY;
44750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
44850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
449fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			alu.dst.sel = ctx->shader->input[input].gpr;
45050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
45150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
45250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
45350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
454fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
455fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].sel = gpr;
456fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].chan = (base_chan - (i % 2));
457fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
458fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
45950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
46050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
46150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
46250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
46350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
46450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
46550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
46650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
46750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
46850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}
46950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
47050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
471de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
47272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
473de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
474de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_vtx vtx;
475de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
476de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int r;
47772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
478de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
48335e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
4848a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie		ctx->shader->input[i].centroid = d->Declaration.Centroid;
485de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i;
486de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
487de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* turn input into fetch */
488de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			memset(&vtx, 0, sizeof(struct r600_bc_vtx));
489de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.inst = 0;
490de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.fetch_type = 0;
491de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.buffer_id = i;
492de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* register containing the index into the buffer */
493de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_gpr = 0;
494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_sel_x = 0;
495de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.mega_fetch_count = 0x1F;
496de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_gpr = ctx->shader->input[i].gpr;
497de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_x = 0;
498de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_y = 1;
499de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_z = 2;
500de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_w = 3;
501e973221538d5edfad62abedf5b37a4fb774d71fcDave Airlie			vtx.use_const_fields = 1;
502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = r600_bc_add_vtx(ctx->bc, &vtx);
503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
504de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
50650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chiprev == 2) {
50750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			/* turn input into interpolate on EG */
508fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->shader->input[i].name != TGSI_SEMANTIC_POSITION) {
509fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				if (ctx->shader->input[i].interpolate > 0) {
510fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie					ctx->shader->input[i].lds_pos = ctx->shader->nlds++;
511fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie					evergreen_interp_alu(ctx, i);
512fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				}
513fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			}
51450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
515de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
516de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i;
52135e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
52533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
52647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
53372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
53472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
535be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
536be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
537be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
538be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
539be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
540fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie/*
541fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to
542fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation.
543fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie *
544fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit
545fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs
546fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required
547fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/
548fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx)
549fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{
550fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int i;
551fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int num_baryc;
552fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
553fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_linear = FALSE;
554fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_perspective = FALSE;
555fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_centroid = FALSE;
556fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr = 1;
557fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
558fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* any centroid inputs */
559fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	for (i = 0; i < ctx->info.num_inputs; i++) {
560fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* skip position/face */
561fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
562fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		    ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
563fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			continue;
564fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
565fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_linear = TRUE;
566fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
567fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_perspective = TRUE;
568fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_centroid[i])
569fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_centroid = TRUE;
570fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
571fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
572fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	num_baryc = 0;
573fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* ignoring sample for now */
574fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_perspective)
575fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
576fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_linear)
577fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
578fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_centroid)
579fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc *= 2;
580fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
581fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr += (num_baryc + 1) >> 1;
582fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
583fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */
584fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	return ctx->num_interp_gpr;
585fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie}
586fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader)
58872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
591c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	struct r600_bc_output output[32];
592457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r = 0, pos0;
59572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
596de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
597de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
598de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_init(ctx.bc, shader->family);
599de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
600de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
601de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
602de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
608076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
609076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
610076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
611076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [256,511] correspond to cfile constants c[0..255].
612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
613076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
614076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
615076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
616076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
624de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
625de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
626de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
631de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
63284457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chiprev == 2) {
633fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
63484457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	}
635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
636de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_INPUT];
637de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
638de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_OUTPUT];
639d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie
640d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie	ctx.file_offset[TGSI_FILE_CONSTANT] = 128;
641d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253;
643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.info.file_count[TGSI_FILE_TEMPORARY];
645de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
646cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
647cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
648cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen
649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
654cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
655cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
656cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
657cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
658cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
659cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
660cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
661cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
662cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
663cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
672de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
674be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
675be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
676be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
677de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
67850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			if (ctx.bc->chiprev == 2)
67950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
68050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
68150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
682de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
683de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
684de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
6852b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			r = r600_bc_add_literal(ctx.bc, ctx.value);
686de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
687de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
688de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
689de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
690de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
691de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
694de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* export output */
696457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
697457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0, pos0 = 0; i < noutput; i++) {
698c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		memset(&output[i], 0, sizeof(struct r600_bc_output));
699c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].gpr = shader->output[i].gpr;
700c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].elem_size = 3;
701c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_x = 0;
702c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_y = 1;
703c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_z = 2;
704c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_w = 3;
705c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].barrier = 1;
706c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
707c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].array_base = i - pos0;
708a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
709457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
712c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 60;
713c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
715457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
716457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
717457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) {
718457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].array_base = 61;
719457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
720457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				/* position doesn't count in array_base */
721457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
726b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse				output[i].array_base = shader->output[i].sid;
727c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
7285f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
729c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 61;
730b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie				output[i].swizzle_x = 2;
73139d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_y = 7;
73239d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_z = output[i].swizzle_w = 7;
73339d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
73439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
73539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].array_base = 61;
73639d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_x = 7;
73739d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_y = 1;
73839d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_z = output[i].swizzle_w = 7;
739c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
740de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
743de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
75072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
751457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
752457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
753457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
754457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		for (i = 0, pos0 = 0; i < noutput; i++) {
755457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) {
756457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0 = 1;
757457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				break;
758457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
759457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
760457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (!pos0) {
761457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			memset(&output[i], 0, sizeof(struct r600_bc_output));
762457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].gpr = 0;
763457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].elem_size = 3;
764457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_x = 0;
765457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_y = 1;
766457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_z = 2;
767457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_w = 3;
768457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].barrier = 1;
769457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
770457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].array_base = 0;
7717e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
772457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			noutput++;
773de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
774c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
775481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
776481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) {
777481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		memset(&output[0], 0, sizeof(struct r600_bc_output));
778481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].gpr = 0;
779481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].elem_size = 3;
780481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_x = 7;
781481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_y = 7;
782481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_z = 7;
783481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_w = 7;
784481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].barrier = 1;
785608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse		output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
786481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].array_base = 0;
787a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
788481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		noutput++;
789481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
790457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
791457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
792457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (i == (noutput - 1)) {
793457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].end_of_program = 1;
794457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
795b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
796b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
797a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
798c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
799c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
800457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
801457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
802c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		r = r600_bc_add_output(ctx.bc, &output[i]);
803de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
804de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
805de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
806cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
807de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
808de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
809de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
810cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
813de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
814de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
816de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
817de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode);
818de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
819de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
823de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
824de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
825de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
826de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx,
827de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_src_register *tgsi_src,
828de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_src *r600_src)
829de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
830cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	int index;
8317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(r600_src, 0, sizeof(struct r600_bc_alu_src));
832de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel = tgsi_src->Register.Index;
833de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->sel = 0;
835cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		index = tgsi_src->Register.Index;
836cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[0] = ctx->literals[index * 4 + 0];
837cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[1] = ctx->literals[index * 4 + 1];
838cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[2] = ctx->literals[index * 4 + 2];
839cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[3] = ctx->literals[index * 4 + 3];
840de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
84147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_src->Register.Indirect)
84247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_src->rel = V_SQ_REL_RELATIVE;
8431bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse	r600_src->neg = tgsi_src->Register.Negate;
8448260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell	r600_src->abs = tgsi_src->Register.Absolute;
845de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
846de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
847de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
848de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
849de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx,
850de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_dst_register *tgsi_dst,
851de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			unsigned swizzle,
852de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_dst *r600_dst)
853de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
8547a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
8557a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
856de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
86047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
86147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
8627a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
8637a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
8647a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
866de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
8687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle)
8697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
8707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	switch (swizzle) {
8717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 0:
8727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleX;
8737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 1:
8747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleY;
8757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 2:
8767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleZ;
8777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 3:
8787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleW;
8797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	default:
8807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return 0;
8817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
8827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
8837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
8847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3])
8857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
8867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
8877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
8887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	int i, j, k, nconst, r;
8897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
8907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
8917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
8927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			nconst++;
8937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
8947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]);
8957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r) {
8967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
8977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
8987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
8997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
9009d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
901be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			int treg = r600_get_temp(ctx);
9027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			for (k = 0; k < 4; k++) {
9037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				memset(&alu, 0, sizeof(struct r600_bc_alu));
904a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
9059d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse				alu.src[0].sel = r600_src[i].sel;
9067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[0].chan = k;
90740cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid				alu.src[0].rel = r600_src[i].rel;
908be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.sel = treg;
9097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.chan = k;
9107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.write = 1;
9117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (k == 3)
9127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					alu.last = 1;
9137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				r = r600_bc_add_alu(ctx->bc, &alu);
9147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (r)
9157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					return r;
9167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			}
9179d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			r600_src[i].sel = treg;
91840cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid			r600_src[i].rel =0;
9197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			j--;
9207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
9217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
9227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
9237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
9247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
925be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
926be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3])
927be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
928be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
929be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	struct r600_bc_alu alu;
93020846a8ce102aa2bc6d3f1e907d490940c0d0a69Vinson Lee	int i, j, k, nliteral, r;
931be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
932be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
933be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) {
934be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			nliteral++;
935be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		}
936be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
9379d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
9389d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) {
939be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			int treg = r600_get_temp(ctx);
940be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			for (k = 0; k < 4; k++) {
941be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
942a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
9439d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse				alu.src[0].sel = r600_src[i].sel;
944be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.src[0].chan = k;
945be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.sel = treg;
946be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.chan = k;
947be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.write = 1;
948be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				if (k == 3)
949be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie					alu.last = 1;
950be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
951be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				if (r)
952be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie					return r;
953be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			}
9549d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			r = r600_bc_add_literal(ctx->bc, &ctx->literals[inst->Src[i].Register.Index * 4]);
955be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			if (r)
956be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				return r;
9579d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			r600_src[i].sel = treg;
9589d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			j--;
959be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		}
960be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
961be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return 0;
962be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
963be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
964d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap)
965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
9677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
968de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
969de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
970d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	int lasti = 0;
971d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
972d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
973d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (inst->Dst[0].Register.WriteMask & (1 << i)) {
974d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
975d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
976d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
977de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
9787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
9797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9819d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
9829d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
9839d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
984d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
985d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
986d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
987d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
988de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
989d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
990d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (r)
991d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			return r;
992d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
993d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
994d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
995de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
9967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j] = r600_src[j];
9977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
998de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
999d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
1000d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[0] = r600_src[1];
1001d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[1], i);
1002d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1003d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[1] = r600_src[0];
1004d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1005de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1006de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
1007de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1008de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
1009de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.src[1].neg = 1;
1010de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
10117a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
10127a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			alu.src[0].abs = 1;
10137a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
1014de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1015de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1016de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1017d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (i == lasti) {
1018de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1019de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1020de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1021de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1022de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1023de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1024de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1025de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1026de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1027d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
1028d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
1029d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 0);
1030d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1031d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1032d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
1033d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
1034d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 1);
1035d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1036d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
103788f5976484842671ecb2cefcfa91838a43032359Dave Airlie/*
103888f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
103988f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
104088f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
104188f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
104292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_setup_trig(struct r600_shader_ctx *ctx,
104392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie			   struct r600_bc_alu_src r600_src[3])
104488f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
104588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
104692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int r;
104788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	uint32_t lit_vals[4];
104892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
104992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
105088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(lit_vals, 0, 4*4);
105188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
105288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
105388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
10549d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
10559d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
10569d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
1057be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
1058be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	r = tgsi_split_literal_constant(ctx, r600_src);
1059be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	if (r)
1060be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		return r;
1061be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
106288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	lit_vals[0] = fui(1.0 /(3.1415926535 * 2));
106388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	lit_vals[1] = fui(0.5f);
106488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
106588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1066a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
106788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
106888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
106988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
107088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
107188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
107288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
107388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0] = r600_src[0];
107488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
107588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
1076921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
107788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1078921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
107988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[2].chan = 1;
108088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
108188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
108288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
108388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
108488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_literal(ctx->bc, lit_vals);
108588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
108688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
108788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
108888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1089a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
109088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
109188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
109288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
109388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
109488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
109588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
109688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
109788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
109888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
109988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
110088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
110188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
110288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (ctx->bc->chiprev == 0) {
110388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[0] = fui(3.1415926535897f * 2.0f);
110488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[1] = fui(-3.1415926535897f);
110588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	} else {
110688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[0] = fui(1.0f);
110788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[1] = fui(-0.5f);
110888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
110988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
111088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1111a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
111288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
111388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
111488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
111588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
111688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
111788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
111888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
111988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
112088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
1121921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
112288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1123921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
112488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[2].chan = 1;
112588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
112688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
112788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
112888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
112988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_literal(ctx->bc, lit_vals);
113088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
113188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
113292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
113392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
113492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
113592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
113692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
113792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
113892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu_src r600_src[3];
113992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
114092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
1141be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	int lasti = 0;
114292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
114392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	r = tgsi_setup_trig(ctx, r600_src);
114492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
114592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
114688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
114788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
114888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
114988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
115088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
115188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
115288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
115388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
115488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
115588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
115688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
115788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
115888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
115988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
116088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
116188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	for (i = 0; i < 4; i++) {
1162be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (inst->Dst[0].Register.WriteMask & (1 << i))
1163be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			lasti = i;
1164be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
1165be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1166be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1167be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
1168be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
116988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1170a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1171be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
1172be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
117388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
117488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
117588f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
1176be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
117788f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
117888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
117988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
118088f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
118188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
118288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
118388f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
118488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
118592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(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 r;
119192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
119257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
119357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
119457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
119557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
119657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = tgsi_setup_trig(ctx, r600_src);
119757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
119857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
119957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
120092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
120192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
120257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
120357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
120457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
120557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
120657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
120757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
120892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
120957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
121057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].chan = 0;
121157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.last = 1;
121257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
121357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
121457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
121557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
121692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
121792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
121857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
121957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
122057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
122157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
122257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
122357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
122457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
122557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
122657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].chan = 0;
122757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.last = 1;
122857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
122957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
123057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
123157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
123292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1233ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
1234ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
1235ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
1236ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1237ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1238ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1239ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
1240ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1241ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1242ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1243ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
1244ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1245ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1246ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1247ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1248ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
1249ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1250ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1251ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1252ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
1253ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1254ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1255ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1256ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1257ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
1258ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
1259ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
1260ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1261ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1262ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1263ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1264ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1265ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1266ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1267ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
1268ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1269ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1270ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1271ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1272ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
1273ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1274ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1275ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1276ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
1277ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1278ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1279ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1280ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
128192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
128292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
128392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1284094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
1285094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
1286094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1287094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct r600_bc_alu alu;
1288094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
1289094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
1290094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
1291094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1292094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
12934502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1294094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
12954502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1296921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
12974502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
12984502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
12994502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
13004502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
13014502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
13024502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
13034502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			if (r)
13044502b17901ad491e0598ee59a12d372c008ae03bDave Airlie				return r;
13054502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
13064502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
1307094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
1308094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
1309094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
1310094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1311094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
1312094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
1313094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
13144502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
13154502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	if (r)
13164502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		return r;
13174502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
13184502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
13194502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
13204502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
1321094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
1322094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
1323094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
13240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
13250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
13260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13270bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct r600_bc_alu alu;
1328ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	struct r600_bc_alu_src r600_src[3];
13290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
13300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
1331ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
1332ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	if (r)
1333ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		return r;
1334d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie	r = tgsi_split_literal_constant(ctx, r600_src);
1335d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie	if (r)
1336d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie		return r;
1337ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie
13387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.x, <- 1.0  */
13397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1340a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1341921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
13427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
13437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
13447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
13457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
13467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
13477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
13487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
13497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
13500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.y = max(src.x, 0.0) */
13527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1353a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
1354ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	alu.src[0] = r600_src[0];
1355921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
135685e401d8bfd80450a31eac234e13008e33e64227Dave Airlie	alu.src[1].chan = 0;
13577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
13587e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
13597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
13607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
13617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
13627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
13637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
13640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.w, <- 1.0  */
13667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1367a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1368921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1;
13697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
13707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
13717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
13727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
13737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
13747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.last = 1;
13757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
13767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
13777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
13780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13795ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
13805ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	if (r)
13815ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		return r;
13825ea238b7991331c854e66a16911d616d36965dc9Dave Airlie
13830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
13840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
13856a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
13866a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
13876a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
13880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = log(src.y) */
13890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1390a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1391ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0] = r600_src[0];
1392ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
13930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
13940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13960bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
13970bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
13980bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
14000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
14015ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
14025ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
14035ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
140485e401d8bfd80450a31eac234e13008e33e64227Dave Airlie
14056a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
14066a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
14070bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
14080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */
14090bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1410a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
1411ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0] = r600_src[0];
14127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
14130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].sel  = sel;
14140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].chan = chan;
1415ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie
1416ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[2] = r600_src[0];
14177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[2].chan = tgsi_chan(&inst->Src[0], 0);
14180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
14190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
14200bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
14210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
14220bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
14230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
14240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
14250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
14260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
14275ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
14285ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
14295ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
14300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = exp(tmp.x) */
14310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1432a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
14330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].sel = ctx->temp_reg;
14340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].chan = 0;
14350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
14360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
14370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
14380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
14390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
14400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
14410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
14420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
14430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
14440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
14450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
144642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
144742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
144842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
144942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct r600_bc_alu alu;
145042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
145142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
145242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	memset(&alu, 0, sizeof(struct r600_bc_alu));
1453df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
1454df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
1455df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
1456df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
1457df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
1458df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
1459df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
146042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
146142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]);
146242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		if (r)
146342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck			return r;
146442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		alu.src[i].chan = tgsi_chan(&inst->Src[i], 0);
146542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		alu.src[i].abs = 1;
146642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
146742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
146842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
146942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
147042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	r = r600_bc_add_alu(ctx->bc, &alu);
147142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
147242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
147342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	r = r600_bc_add_literal(ctx->bc, ctx->value);
147442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
147542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
147642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
147742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
147842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
147942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
1480a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
14817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
14827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
14837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
1484a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
14857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
14867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
14877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
14887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1489a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
14907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
14917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
14927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
14937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
14947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
14957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
14967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
14977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
14987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
14997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
15007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
15017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
15027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
15037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1504a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1505a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1506a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1507a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1508a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1509a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1510a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1511a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
1512a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
1513a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]);
1514a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		if (r)
1515a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse			return r;
1516a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		alu.src[i].chan = tgsi_chan(&inst->Src[i], 0);
1517a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
1518a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1519a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1520a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1521a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1522a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1523a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
15245ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
15255ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	if (r)
15265ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		return r;
1527a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
1528a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1529a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1530a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1531a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
1532a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1533a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1534a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1535a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
1536a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1537a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
1538a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1539a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
1540a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1541a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1542a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1543a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
1544a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1545a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1546a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1547a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1548a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1549a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1550e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1551e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1552e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1553a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
1554a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1555a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL_IEEE);
1556a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = tgsi_src(ctx, &inst->Src[1], &alu.src[0]);
1557a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1558a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1559a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[1], 0);
1560a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
1561a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1562a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1563a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1564a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1565a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1566a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1567e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1568e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1569e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1570a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
1571a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1572a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
1573a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
1574a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1575a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1576a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1577a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1578a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1579a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1580e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1581e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1582e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1583a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1584a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1585a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
15860d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
15870d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
15880d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15890d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu alu;
15900d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu_src r600_src[3];
1591921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
15920d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15930d48925a56ad4fb253386110b545abda82a25464Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
15940d48925a56ad4fb253386110b545abda82a25464Dave Airlie	if (r)
15950d48925a56ad4fb253386110b545abda82a25464Dave Airlie		return r;
15969d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
15979d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
15989d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
15990d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16000d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
16010d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
16020d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1603a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
16040d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
1605cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
16060d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
1607cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
16080d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16090d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0] = r600_src[0];
16100d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
16110d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1612921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
16130d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16140d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2] = r600_src[0];
16150d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].chan = tgsi_chan(&inst->Src[0], i);
16160d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
16170d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
16180d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
16190d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
16200d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
16210d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
1622cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
1623cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie	if (r)
1624cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		return r;
16250d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16260d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
16270d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
16280d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1629a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
16300d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
16310d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16320d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
16330d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
16340d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16350d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1636cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
16370d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
16380d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1639921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
16400d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
16410d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16420d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
1643cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
16440d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16450d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
16460d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
16470d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
16480d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
16490d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
16500d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
16510d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
16520d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
16530d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1654cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
1655cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1656cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1657cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
1658cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
16599961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
16609961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	if (r)
16619961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse		return r;
1662cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
1663cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1664cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
1665a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
16666c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
1667cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
1668a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1669cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1670cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (r)
1671cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				return r;
1672cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
1673cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
1674cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1675cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
1676cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
1677cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1678cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1679cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
1680cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
1681cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
1682cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
1683cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1684cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1685de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
1686de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1687de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
16887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1689de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
1690de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
1691de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
16927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
16937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
16947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
16959d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
16969d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
16979d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
1698de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* do it in 2 step as op3 doesn't support writemask */
1699de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1700de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1701de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1702de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
17037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
17047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
1708cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
1710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1717cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1718cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1719cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1720cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
1721cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1722cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1724cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1725cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
1726cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
17277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
17287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
17297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
17309d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
17319d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
17329d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
1733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1734de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1735cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1736cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
17377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
17387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1739cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1740cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1741cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
1742cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1743cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
1744cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1745cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
1746cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
1747921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1748cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1749cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1750cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1751cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
1752cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
1753921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1754cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1755cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1756cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1757e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
1758e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
1759e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
1760e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
1761e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
1762e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
1763e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
1764cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
1765cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1767de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1768de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1769de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1770de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1771de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1772de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1773de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1774cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1775de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1776de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
177733241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
177833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
177933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
178033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct r600_bc_tex tex;
1781641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	struct r600_bc_alu alu;
1782641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
1783b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	int r, i;
1784bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
1785bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	boolean src_not_temp = inst->Src[0].Register.File != TGSI_FILE_TEMPORARY;
1786bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	uint32_t lit_vals[4];
1787641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1788641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index;
1789641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1790b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
1791b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
1792b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1793a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1794bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1795bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1796bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1797bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1798b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
1799b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1800b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1801b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1802b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1803b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1804b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1805b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
18069d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
1807b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
1808b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1809a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
1810b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
1811b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].chan = 3;
1812bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
1813bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1814bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1815b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1816b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1817b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1818b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1819b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1820b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1821b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1822b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1823b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1824a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1825921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1826b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
1827b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1828b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1829b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1830b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1831b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1832b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1833b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
183407b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson		src_not_temp = FALSE;
1835b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1836bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1837bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1838bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
1839bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		int src_chan, src2_chan;
1840bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1841bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
1842bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
1843bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1844a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
1845bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			switch (i) {
1846bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 0:
1847bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 2;
1848bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 1;
1849bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1850bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 1:
1851bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 2;
1852bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 0;
1853bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1854bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 2:
1855bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 0;
1856bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 2;
1857bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1858bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 3:
1859bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 1;
1860bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 2;
1861bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
186284b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee			default:
186384b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				assert(0);
186484b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				src_chan = 0;
186584b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				src2_chan = 0;
186684b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				break;
1867bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			}
1868bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1869bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1870bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1871bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], src_chan);
1872bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
1873bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1874bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1875bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], src2_chan);
1876bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
1877bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
1878bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
1879bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
1880bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
1881bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1882bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1883bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1884bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
1885bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1886bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
1887bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1888a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1889bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1890bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 2;
1891bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].abs = 1;
1892bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1893bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 2;
1894bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1895bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
1896bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1897bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1898bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1899bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1900bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
1901bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
1902bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * muladd has no writemask, have to use another temp
1903bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
1904bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1905a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1906bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1907bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1908bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1909bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
1910bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1911bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
1912bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1913bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1914bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
1915bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1916bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1917bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
1918bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1919bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1920bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1921bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1922bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1923bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1924bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1925a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1926bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1927bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1928bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1929bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
1930bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1931bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
1932bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1933bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1934bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
1935bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1936bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1937bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
1938bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1939bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1940bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
1941bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1942bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1943bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1944bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1945bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		lit_vals[0] = fui(1.5f);
1946bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1947bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_literal(ctx->bc, lit_vals);
1948bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1949bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
195007b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson		src_not_temp = FALSE;
1951bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
1952bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1953bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1954bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (src_not_temp) {
1955b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
1956b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1957a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1958b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = src_gpr;
1959a21a2748beb1f42d21e14858eee9a1323d85a00fFredrik Höglund			alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
1960b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1961b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1962b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
1963b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
1964b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1965b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1966b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1967b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1968b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1969b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1970b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
1971bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1972bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
1973bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (opcode == SQ_TEX_INST_SAMPLE &&
1974bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	    (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D))
1975bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		opcode = SQ_TEX_INST_SAMPLE_C;
197633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
197733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	memset(&tex, 0, sizeof(struct r600_bc_tex));
1978bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
1979ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie	tex.sampler_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index;
1980ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie	tex.resource_id = tex.sampler_id;
1981ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie	if (ctx->shader->processor_type == TGSI_PROCESSOR_VERTEX)
1982ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie		tex.resource_id += PIPE_MAX_ATTRIBS;
1983641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
19846c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
19859d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
19869d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
19879d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
19889d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
198933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_x = 0;
199033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_y = 1;
199133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_z = 2;
199233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_w = 3;
19939a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
1994bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
1995bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
1996bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
1997bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
1998bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
1999bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
2000bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
200101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
200201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
200301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
20047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		tex.coord_type_z = 1;
200501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_w = 1;
200601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
2007bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2008bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)
20095d5f693cefe452bd8bd7e45f8b5d7ed991ae5115Dave Airlie		tex.src_sel_w = 2;
2010bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2011bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	r = r600_bc_add_tex(ctx->bc, &tex);
2012bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
2013bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
2014bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2015bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
2016bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
2017bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
201833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
201933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
2020b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
2021b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
2022b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
20237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
2024b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct r600_bc_alu alu;
2025b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
2026b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
2027b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
20287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
20297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
20307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
20319d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
20329d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
20339d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
2034b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
2035b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
2036b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
2037a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
2038921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
2039b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
20407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[0];
20417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
2042b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[1].neg = 1;
2043b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2044b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2045b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
2046b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2047b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2048b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
2049b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
2050b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2051b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2052b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2053b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
2054b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
2055b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
2056b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2057b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
2058b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
2059b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
2060a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
2061b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
2062b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
20637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[2];
20647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
2065b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2066b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2067b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
2068b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2069b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2070b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
2071b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
2072b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2073b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2074b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2075b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
2076b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
2077b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
2078b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2079b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
2080b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
2081b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
2082a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2083b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
20847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0] = r600_src[0];
20857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
20867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[1];
20877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[1], i);
2088b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
2089b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
2090b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2091b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2092b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
2093b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2094b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2095b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
2096b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2097b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2098b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2099b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	return tgsi_helper_copy(ctx, inst);
2100b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
2101b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
210287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
210387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
210487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
210587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu_src r600_src[3];
210687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu alu;
210787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int use_temp = 0;
210887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
210987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
211087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	r = tgsi_split_constant(ctx, r600_src);
211187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (r)
211287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		return r;
21139d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
21149d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
21159d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
211687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
211787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
211887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		use_temp = 1;
211987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
212087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	for (i = 0; i < 4; i++) {
212187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2122a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
212387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[0] = r600_src[0];
212487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
212587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
212687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[1] = r600_src[2];
212787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
212887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
212987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[2] = r600_src[1];
213087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[2].chan = tgsi_chan(&inst->Src[1], i);
213187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
213287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (use_temp)
213387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.dst.sel = ctx->temp_reg;
213487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		else {
213587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
213687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			if (r)
213787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie				return r;
213887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		}
213987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
214087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
214187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
214287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (i == 3)
214387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
214487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
214587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
214687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
214787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	}
214887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (use_temp)
214987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		return tgsi_helper_copy(ctx, inst);
215087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
215187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
215287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
21530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
21540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
21550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
21560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu_src r600_src[3];
21570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu alu;
21580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
21590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
21600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
21620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
21630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
21650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (r)
21660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return r;
21679d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
21689d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
21699d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
21709d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
21710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
21720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2173a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
21740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[0] = r600_src[0];
21760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
21770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
21780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 2);
21790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
21810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
21820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
21840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
21850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
21870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
21880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
21890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
21900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[1] = r600_src[1];
21920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
21930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
21940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 1);
21950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
21970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 2);
21980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
22000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 0);
22010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
22020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
22030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
22040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
22050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
22060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
22080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
22090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
22100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
22120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
22130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
22140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
22150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
22161e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck
22171e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
22181e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck		if (r)
22191e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck			return r;
22200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
22210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
22230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2224a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
22250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[0] = r600_src[0];
22270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
22280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
22290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
22300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
22310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
22320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 2);
22330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
22340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
22350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
22360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
22370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
22380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
22390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
22400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
22410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[1] = r600_src[1];
22430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
22440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
22450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 2);
22460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
22470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
22480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 0);
22490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
22500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
22510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 1);
22520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
22530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
22540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
22550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
22560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
22570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
22590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
22600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
22610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
22630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
22640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		else {
22650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
22660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			if (r)
22670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie				return r;
22680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
22690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
22700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
22710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
22720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
22730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
22740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
22750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
22760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
22771e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck
22781e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
22791e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck		if (r)
22801e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck			return r;
22810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
22820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
22830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
22840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
22850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
22860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
228736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
228836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
228936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
229036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct r600_bc_alu_src r600_src[3];
229136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct r600_bc_alu alu;
229209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
229336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
229436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
229536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
229636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
229736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2298a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
229936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
230036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
230136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
230236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
230336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
230436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
230536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
230636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
230736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
230836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
230936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
231036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
231136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
231236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
23135ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
23145ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
23155ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
23165ea238b7991331c854e66a16911d616d36965dc9Dave Airlie
2317a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
231836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
231936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
232036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
232136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
232236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
232336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
232436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
232536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
232636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
232736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
23285ea238b7991331c854e66a16911d616d36965dc9Dave Airlie
23295ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
23305ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
23315ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
233236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
233336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
233436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
233536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
233636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
233736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2338a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
233936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0] = r600_src[0];
234036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
234136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
234236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
234336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
234436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
234536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
234636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
234736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//		if (r)
234836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//			return r;
234936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
235036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
235136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
235236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
235336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
235436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
235536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
235636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
23575ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
23585ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
23595ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
236036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
236136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
236236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
236336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
236436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2365a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
236636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
236736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
236836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
236936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
237036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
237136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
237236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
237336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 2;
237436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
237536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
237636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
237736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
237836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
237936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
23805ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
23815ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
23825ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
238336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
238436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
238536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
238636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
238736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
238836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2389a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
239036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
239136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
239236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
239336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
239436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
239536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
239636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
239736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
239836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
239936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
24005ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
24015ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
24025ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
240336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
240436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
240536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
240687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
2407460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
2408460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
2409460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2410460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct r600_bc_alu alu;
2411460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
2412460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2413460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.x = floor(log2(src)); */
2414460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
2415460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2416460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2417460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
2418460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2419460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2420460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2421460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2422460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2423460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2424460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2425460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2426460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2427460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2428460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2429460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2430460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2431460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2432460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2433460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2434460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2435460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2436460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
2437460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
2438460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2439460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2440460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2441460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2442460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2443460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2444460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2445460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2446460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2447460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2448460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2449460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2450460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2451460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2452460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2453460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
245496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck	/* result.y = src.x / (2 ^ floor(log2(src.x))); */
2455460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
2456460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2457460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
245896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
245996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
246096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
246196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
246296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
246396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
246496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
246596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
246696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
246796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
246896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
246996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
247096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
247196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
247296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
247396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
247496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
247596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
247696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
247796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
247896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
247996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
248096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
248196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
248296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
248396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
248496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
248596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
248696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
248796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
248896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
248996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
249096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
249196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
249296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
249396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
249496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
249596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
249696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
249796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
249896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
249996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
250096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
250196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
250296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
250396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
250496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
250596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
250696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
250796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
250896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
250996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
251096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
251196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
251296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
251396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
251496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
251596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
251696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
251796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
251896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
251996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
252096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
252196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
252296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
252396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
252496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
252596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
252696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
252796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
252896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
252996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
253096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
253196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
253296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
253396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
253496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
253596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
253696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
253796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
253896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
253996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
254096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
254196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
254296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
254396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
254496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
254596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
254696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
2547460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2548460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2549460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
2550460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2551460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2552460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2553460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2554460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2555460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2556460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2557460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2558460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2559460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2560460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2561460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2562460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.z = log2(src);*/
2563460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
2564460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2565460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2566460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
2567460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2568460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2569460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2570460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2571460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2572460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2573460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2574460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2575460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 2;
2576460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2577460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2578460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2579460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2580460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2581460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2582460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2583460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2584460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2585460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2586460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2587460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
2588460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
2589460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2590460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2591460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2592460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2593460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2594460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2595460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2596460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
2597460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2598460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2599460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2600460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2601460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2602460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2603460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2604460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2605460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2606460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2607460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2608460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2609460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
2610460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
2611460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
261250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie/* r6/7 only for now */
261347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airliestatic int tgsi_arl(struct r600_shader_ctx *ctx)
261447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
261547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	/* TODO from r600c, ar values don't persist between clauses */
261647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
261747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct r600_bc_alu alu;
261847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
261947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
262047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
262147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR;
262247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
262347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
262447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (r)
262547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		return r;
262647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
262747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
262847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.last = 1;
262947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
2630a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU));
263147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (r)
263247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		return r;
2633c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie	ctx->bc->cf_last->r6xx_uses_waterfall = 1;
263447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
263547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
263647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
263757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
263857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
263957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
264057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct r600_bc_alu alu;
264157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
264257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
264357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
264457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
264557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2646a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
264757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
264857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
264957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
265057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
265157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	        if (i == 0 || i == 3) {
265257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
265357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
265457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
265557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			if (r)
265657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie				return r;
265757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
265857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
265957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
266057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	        if (i == 0 || i == 2) {
266157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
266257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
266357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			r = tgsi_src(ctx, &inst->Src[1], &alu.src[1]);
266457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			if (r)
266557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie				return r;
266657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], i);
266757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
266857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
266957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
267057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
267157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
267257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
267357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
267457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
267557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
267657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2677a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
2678a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2679a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
268009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_bc_alu alu;
2681a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
2682a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2683a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
2684a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
2685a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
2686a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2687a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
2688a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
2689a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
2690a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2691a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2692a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
2693a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
2694a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2695a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
2696a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
2697a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2698a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
2699a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2700a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
2701a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
2702a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
2703a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2704a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2705a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2706a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
2707a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2708a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
2709a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = pops;
2710a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2711a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2712a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
271309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
2714a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
271509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
271609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
271709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
271809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
271909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
272009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
272109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
272209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
272309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
272409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
272509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
272609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
272709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
272809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2729a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
273009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
273109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
273209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
273309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
273409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
273509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
273609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
273709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
273809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
273909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
274009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
2741a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
2742a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
2743a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
274409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
274509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
274609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
274709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
274809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
274909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
275009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
275109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
275209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
275309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
275409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
275509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
275609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
275709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
275809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
275909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
276009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
276109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
276209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
276309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
276409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
276509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
276609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
276709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
276809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
276909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
277009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
277109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
277209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
277309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
277409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
277509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
277609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid,
277709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie						sizeof(struct r600_bc_cf *) * (sp->num_mid + 1));
277809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
277909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
278009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2781a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
278209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
278309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2784a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
278509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
278609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
278709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
278809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
278909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
279009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
279109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
279209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
279309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
279409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
279509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
279609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
279709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
279809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
279909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
280009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
280109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
280209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
280309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
280409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
280509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN);
280609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
280709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
280809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
280909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
281009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
281109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2812a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP);
281309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
281409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO work out offset */
281509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
281609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2817a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
281809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
281909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
282009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
282109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
282209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
282309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
282409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
282509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
282609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
282709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
282809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
282909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
283009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
283109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
283209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
283309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
283409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
283509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
283609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
283709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
283809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
283909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
284009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
284109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
284209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
284309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
284409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
284509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
284609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
284709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
284809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
284909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
285009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
285109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2852a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
285309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2854a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
285509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
285609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
285709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
285809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
2859a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2860a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2861a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2862a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
2863a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2864a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
2865a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
2866a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
286709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
2868a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
2869a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2870a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2871a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2872a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
2873a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2874a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
2875a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
2876a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
2877a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
2878a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
2879a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2880a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
2881a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
2882a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
2883a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
288409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
2885a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
288609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
288709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
288809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
288909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
289009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
289109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
289209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
289309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2894a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
289509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
289609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
2897a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
289809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
289909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
290009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
290109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
290209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
290309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
290409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
290509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
290609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2907a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
290809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
290909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
291009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
291109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
291209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
291309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
291409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
291509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
291609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
291709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
291809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
291909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
292009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
292109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
292209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
292309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
292409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
292509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
292609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO add LOOPRET support */
292709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
292809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
292909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
293009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
293109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
293209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
293309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
293409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
293509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
293609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
293709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
293809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
293909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
294009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
294109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
294209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
294309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
294409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
294509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
294609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
294709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
294809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
294909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
295009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
295109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
295209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
295309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
2954a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2955a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2956a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2957de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
295847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_arl},
2959de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
29600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
2961df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
2962df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
2963df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
2964df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
2965df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
2966df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
2967df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
296842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
296936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
2970460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
2971de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
2972de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
2973cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
2974cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
297557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
2976dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
2977de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
2978d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
2979be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
2980de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
2981de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
2982b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
2983de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2984de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2985de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2986de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2987de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2988de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2989de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
29903af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
2991de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
29923af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
2993de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
29947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
29954558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
2996a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
29970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
2998de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2999de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30007a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
3001de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3002e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
300388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
30043af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
30053af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
30064502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
3007de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3008de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3009de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3010de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3011de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30120d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
3013de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30140d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
301588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
3016d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
30170d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
3018de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3019b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
3020de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3021b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
3022de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3023de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3024de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3025de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3026de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3027de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3028de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3029de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3030de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3031de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30320d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
303387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
303492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
3035d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
3036de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3037de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3038cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3039ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
304009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
3041a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
3042de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3043de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3044de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3045a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
3046a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
3047de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3048de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3049de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3050de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3051de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3052de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3053de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3054de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30554558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate},
3056de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3057de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3058de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3059de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3060de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3061de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3062de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3063de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3064de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3065de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
306609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
3067de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3068de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
306909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
3070de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
307109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
3072de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3073de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3074de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3075de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3076de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3077de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3078de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3079de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3080de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3081de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3082de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3083de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3084de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3085de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3086de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3087de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3088094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
3089de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
3090de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3091de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3092de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3093de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3094de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3095de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3096de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3097de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3098de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3099de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3102de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3106de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3107de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3108de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3111de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3113de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3114de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3116de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
312050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
312150526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
312250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
312350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
312450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
312550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
312650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate},
312750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
312850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
312950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
313050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
313150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
313250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
313350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
313450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
313550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
313650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
313750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
313850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
313950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
314050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
314150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
314350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
314650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
314950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
315050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
315150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
315250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
315350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
315450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
315550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
315650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
315750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
315850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
315950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
316150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
316250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
316350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
316450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
316550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
317150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
317350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
317450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
317550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
317650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
317850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
318050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
319050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
319150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
319250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
319350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
319450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
319550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
319650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3197ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
319850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
319950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
320050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
320150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
320450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
320550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
320650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate},
321450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
321650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
322050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
322150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
322250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
322350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
322450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
322550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
322650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
322750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
322850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
322950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
323050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
323250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
323850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
324750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
324850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
324950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
3278