r600_shader.c revision a21a2748beb1f42d21e14858eee9a1323d85a00f
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;
1101235becaa1cf7e29f580900592563c3329d326deJerome Glisse	unsigned i, tmp, exports_ps, num_cout, spi_ps_in_control_0, spi_input_z;
1111235becaa1cf7e29f580900592563c3329d326deJerome Glisse	boolean have_pos = FALSE, have_face = FALSE;
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));
1181235becaa1cf7e29f580900592563c3329d326deJerome Glisse		tmp |= S_028644_SEL_CENTROID(1);
1191235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->input[i].name == TGSI_SEMANTIC_POSITION)
1201235becaa1cf7e29f580900592563c3329d326deJerome Glisse			have_pos = TRUE;
1211235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->input[i].name == TGSI_SEMANTIC_COLOR ||
1221235becaa1cf7e29f580900592563c3329d326deJerome Glisse		    rshader->input[i].name == TGSI_SEMANTIC_BCOLOR ||
1231235becaa1cf7e29f580900592563c3329d326deJerome Glisse		    rshader->input[i].name == TGSI_SEMANTIC_POSITION) {
1241235becaa1cf7e29f580900592563c3329d326deJerome Glisse			tmp |= S_028644_FLAT_SHADE(rshader->flat_shade);
1251235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
1261235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->input[i].name == TGSI_SEMANTIC_FACE)
1271235becaa1cf7e29f580900592563c3329d326deJerome Glisse			have_face = TRUE;
1281235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->input[i].name == TGSI_SEMANTIC_GENERIC &&
1291235becaa1cf7e29f580900592563c3329d326deJerome Glisse			rctx->sprite_coord_enable & (1 << rshader->input[i].sid)) {
1301235becaa1cf7e29f580900592563c3329d326deJerome Glisse			tmp |= S_028644_PT_SPRITE_TEX(1);
1311235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
1321235becaa1cf7e29f580900592563c3329d326deJerome Glisse		r600_pipe_state_add_reg(rstate, R_028644_SPI_PS_INPUT_CNTL_0 + i * 4, tmp, 0xFFFFFFFF, NULL);
1331235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1341235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (i = 0; i < rshader->noutput; i++) {
13551f9cc4759c23b74a2e4d9c79b0a5df27d403f54Dave Airlie		if (rshader->output[i].name == TGSI_SEMANTIC_POSITION)
1367777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie			r600_pipe_state_add_reg(rstate,
1377777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie						R_02880C_DB_SHADER_CONTROL,
1387777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie						S_02880C_Z_EXPORT_ENABLE(1),
1397777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie						S_02880C_Z_EXPORT_ENABLE(1), NULL);
14039d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie		if (rshader->output[i].name == TGSI_SEMANTIC_STENCIL)
14139d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			r600_pipe_state_add_reg(rstate,
14239d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie						R_02880C_DB_SHADER_CONTROL,
14339d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie						S_02880C_STENCIL_REF_EXPORT_ENABLE(1),
14439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie						S_02880C_STENCIL_REF_EXPORT_ENABLE(1), NULL);
1451235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1461235becaa1cf7e29f580900592563c3329d326deJerome Glisse
1471235becaa1cf7e29f580900592563c3329d326deJerome Glisse	exports_ps = 0;
1481235becaa1cf7e29f580900592563c3329d326deJerome Glisse	num_cout = 0;
1491235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (i = 0; i < rshader->noutput; i++) {
15039d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie		if (rshader->output[i].name == TGSI_SEMANTIC_POSITION || rshader->output[i].name == TGSI_SEMANTIC_STENCIL)
1511235becaa1cf7e29f580900592563c3329d326deJerome Glisse			exports_ps |= 1;
1521235becaa1cf7e29f580900592563c3329d326deJerome Glisse		else if (rshader->output[i].name == TGSI_SEMANTIC_COLOR) {
1531235becaa1cf7e29f580900592563c3329d326deJerome Glisse			num_cout++;
1541235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
1551235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1561235becaa1cf7e29f580900592563c3329d326deJerome Glisse	exports_ps |= S_028854_EXPORT_COLORS(num_cout);
1571235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (!exports_ps) {
1581235becaa1cf7e29f580900592563c3329d326deJerome Glisse		/* always at least export 1 component per pixel */
1591235becaa1cf7e29f580900592563c3329d326deJerome Glisse		exports_ps = 2;
1601235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1611235becaa1cf7e29f580900592563c3329d326deJerome Glisse
1621235becaa1cf7e29f580900592563c3329d326deJerome Glisse	spi_ps_in_control_0 = S_0286CC_NUM_INTERP(rshader->ninput) |
1631235becaa1cf7e29f580900592563c3329d326deJerome Glisse				S_0286CC_PERSP_GRADIENT_ENA(1);
1641235becaa1cf7e29f580900592563c3329d326deJerome Glisse	spi_input_z = 0;
1651235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (have_pos) {
1661235becaa1cf7e29f580900592563c3329d326deJerome Glisse		spi_ps_in_control_0 |=  S_0286CC_POSITION_ENA(1) |
1671235becaa1cf7e29f580900592563c3329d326deJerome Glisse					S_0286CC_BARYC_SAMPLE_CNTL(1);
1681235becaa1cf7e29f580900592563c3329d326deJerome Glisse		spi_input_z |= 1;
1691235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1701235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate, R_0286CC_SPI_PS_IN_CONTROL_0, spi_ps_in_control_0, 0xFFFFFFFF, NULL);
1711235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate, R_0286D0_SPI_PS_IN_CONTROL_1, S_0286D0_FRONT_FACE_ENA(have_face), 0xFFFFFFFF, NULL);
1721235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate, R_0286D8_SPI_INPUT_Z, spi_input_z, 0xFFFFFFFF, NULL);
1731235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
1741235becaa1cf7e29f580900592563c3329d326deJerome Glisse				R_028840_SQ_PGM_START_PS,
175d22a1247d8a709cf433a6dd99b2f87a224c27d88Jerome Glisse				r600_bo_offset(shader->bo) >> 8, 0xFFFFFFFF, shader->bo);
1761235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
1771235becaa1cf7e29f580900592563c3329d326deJerome Glisse				R_028850_SQ_PGM_RESOURCES_PS,
1781235becaa1cf7e29f580900592563c3329d326deJerome Glisse				S_028868_NUM_GPRS(rshader->bc.ngpr) |
1791235becaa1cf7e29f580900592563c3329d326deJerome Glisse				S_028868_STACK_SIZE(rshader->bc.nstack),
1801235becaa1cf7e29f580900592563c3329d326deJerome Glisse				0xFFFFFFFF, NULL);
1811235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
1821235becaa1cf7e29f580900592563c3329d326deJerome Glisse				R_028854_SQ_PGM_EXPORTS_PS,
1831235becaa1cf7e29f580900592563c3329d326deJerome Glisse				exports_ps, 0xFFFFFFFF, NULL);
1841235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
1851235becaa1cf7e29f580900592563c3329d326deJerome Glisse				R_0288CC_SQ_PGM_CF_OFFSET_PS,
1861235becaa1cf7e29f580900592563c3329d326deJerome Glisse				0x00000000, 0xFFFFFFFF, NULL);
1871235becaa1cf7e29f580900592563c3329d326deJerome Glisse
1881235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (rshader->uses_kill) {
1891235becaa1cf7e29f580900592563c3329d326deJerome Glisse		/* only set some bits here, the other bits are set in the dsa state */
1901235becaa1cf7e29f580900592563c3329d326deJerome Glisse		r600_pipe_state_add_reg(rstate,
1911235becaa1cf7e29f580900592563c3329d326deJerome Glisse					R_02880C_DB_SHADER_CONTROL,
1921235becaa1cf7e29f580900592563c3329d326deJerome Glisse					S_02880C_KILL_ENABLE(1),
1931235becaa1cf7e29f580900592563c3329d326deJerome Glisse					S_02880C_KILL_ENABLE(1), NULL);
1941235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
195738aa29289296512959cbb37d8602131dae44dabDave Airlie	r600_pipe_state_add_reg(rstate,
196738aa29289296512959cbb37d8602131dae44dabDave Airlie				R_03E200_SQ_LOOP_CONST_0, 0x01000FFF,
197738aa29289296512959cbb37d8602131dae44dabDave Airlie				0xFFFFFFFF, NULL);
1981235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
1991235becaa1cf7e29f580900592563c3329d326deJerome Glisse
2001235becaa1cf7e29f580900592563c3329d326deJerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader)
2011235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
2021235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
2031235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader *rshader = &shader->shader;
2041235becaa1cf7e29f580900592563c3329d326deJerome Glisse	void *ptr;
2051235becaa1cf7e29f580900592563c3329d326deJerome Glisse
2061235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* copy new shader */
2071235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (shader->bo == NULL) {
208294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse		shader->bo = r600_bo(rctx->radeon, rshader->bc.ndw * 4, 4096, 0);
2091235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (shader->bo == NULL) {
2101235becaa1cf7e29f580900592563c3329d326deJerome Glisse			return -ENOMEM;
2111235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
212294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse		ptr = r600_bo_map(rctx->radeon, shader->bo, 0, NULL);
2131235becaa1cf7e29f580900592563c3329d326deJerome Glisse		memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * 4);
214294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse		r600_bo_unmap(rctx->radeon, shader->bo);
2151235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
2161235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* build state */
2171235becaa1cf7e29f580900592563c3329d326deJerome Glisse	rshader->flat_shade = rctx->flatshade;
2181235becaa1cf7e29f580900592563c3329d326deJerome Glisse	switch (rshader->processor_type) {
2191235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_VERTEX:
2201235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->family >= CHIP_CEDAR) {
2211235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_vs(ctx, shader);
2221235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
2231235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_vs(ctx, shader);
2241235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
2251235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
2261235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
2271235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->family >= CHIP_CEDAR) {
2281235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_ps(ctx, shader);
2291235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
2301235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_ps(ctx, shader);
2311235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
2321235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
2331235becaa1cf7e29f580900592563c3329d326deJerome Glisse	default:
2341235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return -EINVAL;
2351235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
2361235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_context_pipe_state_set(&rctx->ctx, &shader->rstate);
2371235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return 0;
2381235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
2391235becaa1cf7e29f580900592563c3329d326deJerome Glisse
2401235becaa1cf7e29f580900592563c3329d326deJerome Glissestatic int r600_shader_update(struct pipe_context *ctx, struct r600_pipe_shader *rshader)
2411235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
2421235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
2431235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader *shader = &rshader->shader;
2441235becaa1cf7e29f580900592563c3329d326deJerome Glisse	const struct util_format_description *desc;
2451235becaa1cf7e29f580900592563c3329d326deJerome Glisse	enum pipe_format resource_format[160];
2461235becaa1cf7e29f580900592563c3329d326deJerome Glisse	unsigned i, nresources = 0;
2471235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_bc *bc = &shader->bc;
2481235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_bc_cf *cf;
2491235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_bc_vtx *vtx;
2501235becaa1cf7e29f580900592563c3329d326deJerome Glisse
2511235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (shader->processor_type != TGSI_PROCESSOR_VERTEX)
2521235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return 0;
2536dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie	/* doing a full memcmp fell over the refcount */
2546dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie	if ((rshader->vertex_elements.count == rctx->vertex_elements->count) &&
2556dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie	    (!memcmp(&rshader->vertex_elements.elements, &rctx->vertex_elements->elements, 32 * sizeof(struct pipe_vertex_element)))) {
2561235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return 0;
2571235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
2581235becaa1cf7e29f580900592563c3329d326deJerome Glisse	rshader->vertex_elements = *rctx->vertex_elements;
2591235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (i = 0; i < rctx->vertex_elements->count; i++) {
2601235becaa1cf7e29f580900592563c3329d326deJerome Glisse		resource_format[nresources++] = rctx->vertex_elements->elements[i].src_format;
2611235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
262294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse	r600_bo_reference(rctx->radeon, &rshader->bo, NULL);
2631235becaa1cf7e29f580900592563c3329d326deJerome Glisse	LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) {
2641235becaa1cf7e29f580900592563c3329d326deJerome Glisse		switch (cf->inst) {
2651235becaa1cf7e29f580900592563c3329d326deJerome Glisse		case V_SQ_CF_WORD1_SQ_CF_INST_VTX:
2661235becaa1cf7e29f580900592563c3329d326deJerome Glisse		case V_SQ_CF_WORD1_SQ_CF_INST_VTX_TC:
2671235becaa1cf7e29f580900592563c3329d326deJerome Glisse			LIST_FOR_EACH_ENTRY(vtx, &cf->vtx, list) {
2681235becaa1cf7e29f580900592563c3329d326deJerome Glisse				desc = util_format_description(resource_format[vtx->buffer_id]);
2691235becaa1cf7e29f580900592563c3329d326deJerome Glisse				if (desc == NULL) {
2701235becaa1cf7e29f580900592563c3329d326deJerome Glisse					R600_ERR("unknown format %d\n", resource_format[vtx->buffer_id]);
2711235becaa1cf7e29f580900592563c3329d326deJerome Glisse					return -EINVAL;
2721235becaa1cf7e29f580900592563c3329d326deJerome Glisse				}
2731235becaa1cf7e29f580900592563c3329d326deJerome Glisse				vtx->dst_sel_x = desc->swizzle[0];
2741235becaa1cf7e29f580900592563c3329d326deJerome Glisse				vtx->dst_sel_y = desc->swizzle[1];
2751235becaa1cf7e29f580900592563c3329d326deJerome Glisse				vtx->dst_sel_z = desc->swizzle[2];
2761235becaa1cf7e29f580900592563c3329d326deJerome Glisse				vtx->dst_sel_w = desc->swizzle[3];
2771235becaa1cf7e29f580900592563c3329d326deJerome Glisse			}
2781235becaa1cf7e29f580900592563c3329d326deJerome Glisse			break;
2791235becaa1cf7e29f580900592563c3329d326deJerome Glisse		default:
2801235becaa1cf7e29f580900592563c3329d326deJerome Glisse			break;
2811235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
2821235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
2831235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return r600_bc_build(&shader->bc);
2841235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
2851235becaa1cf7e29f580900592563c3329d326deJerome Glisse
286dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_pipe_shader *shader)
2871235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
2881235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
2891235becaa1cf7e29f580900592563c3329d326deJerome Glisse	int r;
2901235becaa1cf7e29f580900592563c3329d326deJerome Glisse
2911235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (shader == NULL)
2921235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return -EINVAL;
2931235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* there should be enough input */
2941235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (rctx->vertex_elements->count < shader->shader.bc.nresource) {
2951235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("%d resources provided, expecting %d\n",
2961235becaa1cf7e29f580900592563c3329d326deJerome Glisse			rctx->vertex_elements->count, shader->shader.bc.nresource);
2971235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return -EINVAL;
2981235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
2991235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r = r600_shader_update(ctx, shader);
3001235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r)
3011235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
3021235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return r600_pipe_shader(ctx, shader);
3031235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
3041235becaa1cf7e29f580900592563c3329d326deJerome Glisse
3051235becaa1cf7e29f580900592563c3329d326deJerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader);
306dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader, const struct tgsi_token *tokens)
3071235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
3081235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
3091235becaa1cf7e29f580900592563c3329d326deJerome Glisse	int r;
3101235becaa1cf7e29f580900592563c3329d326deJerome Glisse
3111235becaa1cf7e29f580900592563c3329d326deJerome Glisse//fprintf(stderr, "--------------------------------------------------------------\n");
3121235becaa1cf7e29f580900592563c3329d326deJerome Glisse//tgsi_dump(tokens, 0);
3131235becaa1cf7e29f580900592563c3329d326deJerome Glisse	shader->shader.family = r600_get_family(rctx->radeon);
3141235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r = r600_shader_from_tgsi(tokens, &shader->shader);
3151235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
3161235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("translation from TGSI failed !\n");
3171235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
3181235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
3191235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r = r600_bc_build(&shader->shader.bc);
3201235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
3211235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("building bytecode failed !\n");
3221235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
3231235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
3241235becaa1cf7e29f580900592563c3329d326deJerome Glisse//fprintf(stderr, "______________________________________________________________\n");
3251235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return 0;
3261235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
3271235becaa1cf7e29f580900592563c3329d326deJerome Glisse
3281235becaa1cf7e29f580900592563c3329d326deJerome Glisse/*
3291235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader
3301235becaa1cf7e29f580900592563c3329d326deJerome Glisse */
3312b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction;
3322b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
3332b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx {
3342b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_shader_info			info;
3352b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_parse_context		parse;
3362b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	const struct tgsi_token			*tokens;
3372b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				type;
3382b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				file_offset[TGSI_FILE_COUNT];
3392b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				temp_reg;
3402b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
3412b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_bc				*bc;
3422b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader			*shader;
3432b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	u32					value[4];
344cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					*literals;
345cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					nliterals;
346e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe	u32					max_driver_temp_used;
3472b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
3482b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
3492b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
3502b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
3512b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
3522b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
3532b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
3542b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
3552b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
35650526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[];
35742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
36772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
370de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
371c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
372a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
373de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
374de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
375de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
37672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
377a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
378de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
37947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Src[j].Register.Dimension ||
380de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			i->Src[j].Register.Absolute) {
38147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported src %d (dimension %d|absolute %d)\n", j,
38247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie				 i->Src[j].Register.Dimension,
38347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie				 i->Src[j].Register.Absolute);
384de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
385de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
38847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
38947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
39472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
39572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
39650526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int gpr)
39750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
39850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
39950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	struct r600_bc_alu alu;
40050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
40150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
40250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
40350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
40450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
40550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW;
40650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
40750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY;
40850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
40950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
41050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.sel = ctx->shader->input[gpr].gpr;
41150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
41250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
41350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
41450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
41550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.src[0].chan = (1 - (i % 2));
41650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + gpr;
41750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
41850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
41950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
42050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
42150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
42250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
42350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
42450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
42550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
42650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}
42750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
42850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
43072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_vtx vtx;
433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int r;
43572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
440de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
44135e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i;
443de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
444de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* turn input into fetch */
445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			memset(&vtx, 0, sizeof(struct r600_bc_vtx));
446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.inst = 0;
447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.fetch_type = 0;
448de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.buffer_id = i;
449de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* register containing the index into the buffer */
450de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_gpr = 0;
451de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_sel_x = 0;
452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.mega_fetch_count = 0x1F;
453de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_gpr = ctx->shader->input[i].gpr;
454de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_x = 0;
455de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_y = 1;
456de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_z = 2;
457de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_w = 3;
458e973221538d5edfad62abedf5b37a4fb774d71fcDave Airlie			vtx.use_const_fields = 1;
459de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = r600_bc_add_vtx(ctx->bc, &vtx);
460de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
461de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
462de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
46350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chiprev == 2) {
46450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			/* turn input into interpolate on EG */
46550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			evergreen_interp_alu(ctx, i);
46650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
468de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
469de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
470de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
471de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
472de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i;
47335e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
474de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
475de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
476de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
47733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
47847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
483de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
484de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
48572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
48672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
487be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
488be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
489be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
490be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
491be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
492de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader)
49372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
495de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
496c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	struct r600_bc_output output[32];
497457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
498de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
499de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r = 0, pos0;
50072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
501de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_init(ctx.bc, shader->family);
504de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
512de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
513076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
514076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
515076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
516076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [256,511] correspond to cfile constants c[0..255].
517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
518076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
519076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
520076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
521076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
53784457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chiprev == 2) {
53884457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas		ctx.file_offset[TGSI_FILE_INPUT] = 1;
53984457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	}
540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_INPUT];
542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_OUTPUT];
544d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie
545d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie	ctx.file_offset[TGSI_FILE_CONSTANT] = 128;
546d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253;
548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.info.file_count[TGSI_FILE_TEMPORARY];
550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
551cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
552cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
553cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen
554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
559cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
560cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
561cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
562cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
563cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
564cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
565cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
566cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
567cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
568cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
576de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
579be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
580be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
581be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
582de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
58350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			if (ctx.bc->chiprev == 2)
58450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
58550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
58650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
588de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
5902b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			r = r600_bc_add_literal(ctx.bc, ctx.value);
591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
596de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
597de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
598de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
599de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
600de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* export output */
601457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
602457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0, pos0 = 0; i < noutput; i++) {
603c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		memset(&output[i], 0, sizeof(struct r600_bc_output));
604c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].gpr = shader->output[i].gpr;
605c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].elem_size = 3;
606c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_x = 0;
607c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_y = 1;
608c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_z = 2;
609c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_w = 3;
610c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].barrier = 1;
611c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
612c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].array_base = i - pos0;
613a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
614457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
617c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 60;
618c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
620457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
621457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
622457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) {
623457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].array_base = 61;
624457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
625457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				/* position doesn't count in array_base */
626457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
631b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse				output[i].array_base = shader->output[i].sid;
632c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
6335f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
634c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 61;
635b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie				output[i].swizzle_x = 2;
63639d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_y = 7;
63739d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_z = output[i].swizzle_w = 7;
63839d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
63939d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
64039d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].array_base = 61;
64139d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_x = 7;
64239d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_y = 1;
64339d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_z = output[i].swizzle_w = 7;
644c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
645de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
647de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
648de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
65572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
656457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
657457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
658457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
659457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		for (i = 0, pos0 = 0; i < noutput; i++) {
660457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) {
661457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0 = 1;
662457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				break;
663457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
664457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
665457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (!pos0) {
666457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			memset(&output[i], 0, sizeof(struct r600_bc_output));
667457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].gpr = 0;
668457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].elem_size = 3;
669457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_x = 0;
670457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_y = 1;
671457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_z = 2;
672457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_w = 3;
673457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].barrier = 1;
674457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
675457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].array_base = 0;
6767e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
677457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			noutput++;
678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
679c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
680481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
681481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) {
682481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		memset(&output[0], 0, sizeof(struct r600_bc_output));
683481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].gpr = 0;
684481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].elem_size = 3;
685481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_x = 7;
686481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_y = 7;
687481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_z = 7;
688481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_w = 7;
689481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].barrier = 1;
690608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse		output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
691481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].array_base = 0;
692a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
693481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		noutput++;
694481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
695457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
696457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
697457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (i == (noutput - 1)) {
698457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].end_of_program = 1;
699457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
700b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
701b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
702a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
703c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
704c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
705457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
706457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
707c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		r = r600_bc_add_output(ctx.bc, &output[i]);
708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
711cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
715cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode);
723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
729de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx,
732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_src_register *tgsi_src,
733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_src *r600_src)
734de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
735cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	int index;
7367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(r600_src, 0, sizeof(struct r600_bc_alu_src));
737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel = tgsi_src->Register.Index;
738de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
739de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->sel = 0;
740cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		index = tgsi_src->Register.Index;
741cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[0] = ctx->literals[index * 4 + 0];
742cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[1] = ctx->literals[index * 4 + 1];
743cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[2] = ctx->literals[index * 4 + 2];
744cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[3] = ctx->literals[index * 4 + 3];
745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
74647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_src->Register.Indirect)
74747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_src->rel = V_SQ_REL_RELATIVE;
7481bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse	r600_src->neg = tgsi_src->Register.Negate;
749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx,
754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_dst_register *tgsi_dst,
755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			unsigned swizzle,
756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_dst *r600_dst)
757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
7587a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
7597a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
763de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
76447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
76547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
7667a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
7677a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
7687a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
769de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
770de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
771de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
7727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle)
7737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
7747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	switch (swizzle) {
7757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 0:
7767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleX;
7777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 1:
7787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleY;
7797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 2:
7807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleZ;
7817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 3:
7827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleW;
7837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	default:
7847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return 0;
7857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
7867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
7877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
7887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3])
7897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
7907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
7917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
7927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	int i, j, k, nconst, r;
7937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
7947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
7957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
7967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			nconst++;
7977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
7987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]);
7997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r) {
8007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
8017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
8027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
8037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
8049d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
805be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			int treg = r600_get_temp(ctx);
8067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			for (k = 0; k < 4; k++) {
8077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				memset(&alu, 0, sizeof(struct r600_bc_alu));
808a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
8099d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse				alu.src[0].sel = r600_src[i].sel;
8107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[0].chan = k;
81140cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid				alu.src[0].rel = r600_src[i].rel;
812be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.sel = treg;
8137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.chan = k;
8147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.write = 1;
8157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (k == 3)
8167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					alu.last = 1;
8177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				r = r600_bc_add_alu(ctx->bc, &alu);
8187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (r)
8197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					return r;
8207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			}
8219d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			r600_src[i].sel = treg;
82240cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid			r600_src[i].rel =0;
8237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			j--;
8247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
8257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
8267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
8277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
8287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
829be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
830be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3])
831be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
832be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
833be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	struct r600_bc_alu alu;
83420846a8ce102aa2bc6d3f1e907d490940c0d0a69Vinson Lee	int i, j, k, nliteral, r;
835be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
836be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
837be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) {
838be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			nliteral++;
839be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		}
840be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
8419d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
8429d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) {
843be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			int treg = r600_get_temp(ctx);
844be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			for (k = 0; k < 4; k++) {
845be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
846a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
8479d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse				alu.src[0].sel = r600_src[i].sel;
848be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.src[0].chan = k;
849be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.sel = treg;
850be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.chan = k;
851be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.write = 1;
852be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				if (k == 3)
853be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie					alu.last = 1;
854be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
855be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				if (r)
856be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie					return r;
857be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			}
8589d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			r = r600_bc_add_literal(ctx->bc, &ctx->literals[inst->Src[i].Register.Index * 4]);
859be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			if (r)
860be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				return r;
8619d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			r600_src[i].sel = treg;
8629d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			j--;
863be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		}
864be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
865be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return 0;
866be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
867be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
868d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap)
869de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
870de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
8717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
872de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
873de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
874d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	int lasti = 0;
875d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
876d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
877d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (inst->Dst[0].Register.WriteMask & (1 << i)) {
878d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
879d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
880d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
881de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
8827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
8837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
8847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
8859d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
8869d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
8879d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
888d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
889d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
890d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
891d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
892de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
893d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
894d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (r)
895d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			return r;
896d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
897d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
898d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
899de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
9007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j] = r600_src[j];
9017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
902de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
903d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
904d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[0] = r600_src[1];
905d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[1], i);
906d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
907d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[1] = r600_src[0];
908d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
909de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
910de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
911de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
912de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
913de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.src[1].neg = 1;
914de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
9157a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
9167a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			alu.src[0].abs = 1;
9177a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
918de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
919de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
920de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
921d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (i == lasti) {
922de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
923de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
924de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
925de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
926de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
927de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
928de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
929de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
930de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
931d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
932d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
933d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 0);
934d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
935d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
936d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
937d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
938d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 1);
939d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
940d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
94188f5976484842671ecb2cefcfa91838a43032359Dave Airlie/*
94288f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
94388f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
94488f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
94588f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
94692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_setup_trig(struct r600_shader_ctx *ctx,
94792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie			   struct r600_bc_alu_src r600_src[3])
94888f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
94988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
95092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int r;
95188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	uint32_t lit_vals[4];
95292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
95392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
95488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(lit_vals, 0, 4*4);
95588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
95688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
95788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
9589d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
9599d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
9609d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
961be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
962be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	r = tgsi_split_literal_constant(ctx, r600_src);
963be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	if (r)
964be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		return r;
965be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
96688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	lit_vals[0] = fui(1.0 /(3.1415926535 * 2));
96788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	lit_vals[1] = fui(0.5f);
96888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
96988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
970a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
97188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
97288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
97388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
97488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
97588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
97688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
97788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0] = r600_src[0];
97888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
97988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
980921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
98188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
982921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
98388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[2].chan = 1;
98488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
98588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
98688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
98788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
98888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_literal(ctx->bc, lit_vals);
98988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
99088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
99188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
99288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
993a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
99488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
99588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
99688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
99788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
99888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
99988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
100088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
100188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
100288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
100388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
100488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
100588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
100688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (ctx->bc->chiprev == 0) {
100788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[0] = fui(3.1415926535897f * 2.0f);
100888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[1] = fui(-3.1415926535897f);
100988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	} else {
101088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[0] = fui(1.0f);
101188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[1] = fui(-0.5f);
101288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
101388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
101488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1015a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
101688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
101788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
101888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
101988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
102088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
102188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
102288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
102388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
102488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
1025921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
102688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1027921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
102888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[2].chan = 1;
102988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
103088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
103188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
103288f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
103388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_literal(ctx->bc, lit_vals);
103488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
103588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
103692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
103792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
103892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
103992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
104092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
104192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
104292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu_src r600_src[3];
104392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
104492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
1045be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	int lasti = 0;
104692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
104792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	r = tgsi_setup_trig(ctx, r600_src);
104892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
104992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
105088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
105188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
105288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
105388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
105488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
105588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
105688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
105788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
105888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
105988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
106088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
106188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
106288f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
106388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
106488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
106588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	for (i = 0; i < 4; i++) {
1066be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (inst->Dst[0].Register.WriteMask & (1 << i))
1067be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			lasti = i;
1068be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
1069be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1070be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1071be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
1072be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
107388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1074a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1075be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
1076be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
107788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
107888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
107988f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
1080be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
108188f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
108288f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
108388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
108488f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
108588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
108688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
108788f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
108888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
108992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
109092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
109192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
109292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu_src r600_src[3];
109392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
109492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int r;
109592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
109657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
109757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
109857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
109957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
110057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = tgsi_setup_trig(ctx, r600_src);
110157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
110257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
110357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
110492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
110592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
110657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
110757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
110857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
110957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
111057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
111157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
111292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
111357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
111457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].chan = 0;
111557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.last = 1;
111657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
111757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
111857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
111957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
112092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
112192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
112257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
112357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
112457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
112557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
112657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
112757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
112857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
112957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
113057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].chan = 0;
113157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.last = 1;
113257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
113357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
113457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
113557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
113692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1137ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
1138ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
1139ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
1140ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1141ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1142ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1143ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
1144ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1145ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1146ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1147ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
1148ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1149ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1150ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1151ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1152ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
1153ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1154ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1155ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1156ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
1157ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1158ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1159ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1160ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1161ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
1162ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
1163ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
1164ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1165ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1166ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1167ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1168ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1169ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1170ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1171ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
1172ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1173ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1174ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1175ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1176ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
1177ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1178ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1179ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1180ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
1181ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1182ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1183ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1184ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
118592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
118692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
118792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1188094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
1189094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
1190094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1191094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct r600_bc_alu alu;
1192094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
1193094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
1194094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
1195094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1196094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
11974502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1198094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
11994502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1200921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
12014502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
12024502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
12034502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
12044502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
12054502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
12064502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
12074502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			if (r)
12084502b17901ad491e0598ee59a12d372c008ae03bDave Airlie				return r;
12094502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
12104502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
1211094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
1212094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
1213094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
1214094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1215094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
1216094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
1217094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
12184502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
12194502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	if (r)
12204502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		return r;
12214502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
12224502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
12234502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
12244502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
1225094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
1226094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
1227094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
12280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
12290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
12300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
12310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct r600_bc_alu alu;
1232ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	struct r600_bc_alu_src r600_src[3];
12330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
12340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
1235ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
1236ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	if (r)
1237ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		return r;
1238d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie	r = tgsi_split_literal_constant(ctx, r600_src);
1239d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie	if (r)
1240d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie		return r;
1241ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie
12427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.x, <- 1.0  */
12437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1244a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1245921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
12467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
12477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
12487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
12507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
12517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
12527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
12540bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
12557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.y = max(src.x, 0.0) */
12567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1257a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
1258ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	alu.src[0] = r600_src[0];
1259921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
126085e401d8bfd80450a31eac234e13008e33e64227Dave Airlie	alu.src[1].chan = 0;
12617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
12627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
12647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
12657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
12667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
12680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
12697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.w, <- 1.0  */
12707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1271a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1272921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1;
12737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
12747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
12757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
12777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
12787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.last = 1;
12797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
12807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
12820bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
12835ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
12845ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	if (r)
12855ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		return r;
12865ea238b7991331c854e66a16911d616d36965dc9Dave Airlie
12870bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
12880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
12896a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
12906a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
12916a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
12920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = log(src.y) */
12930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1294a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1295ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0] = r600_src[0];
1296ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
12970bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
12980bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
12990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
13010bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
13020bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13055ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
13065ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
13075ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
130885e401d8bfd80450a31eac234e13008e33e64227Dave Airlie
13096a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
13106a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
13110bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13120bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */
13130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1314a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
1315ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0] = r600_src[0];
13167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
13170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].sel  = sel;
13180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].chan = chan;
1319ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie
1320ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[2] = r600_src[0];
13217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[2].chan = tgsi_chan(&inst->Src[0], 0);
13220bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
13230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
13240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
13250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
13260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
13270bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
13280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13315ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
13325ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
13335ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
13340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = exp(tmp.x) */
13350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1336a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
13370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].sel = ctx->temp_reg;
13380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].chan = 0;
13390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
13400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
13430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
13440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
13470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
13480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
13490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
135042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
135142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
135242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
135342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct r600_bc_alu alu;
135442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
135542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
135642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	memset(&alu, 0, sizeof(struct r600_bc_alu));
1357df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
1358df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
1359df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
1360df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
1361df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
1362df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
1363df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
136442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
136542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]);
136642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		if (r)
136742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck			return r;
136842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		alu.src[i].chan = tgsi_chan(&inst->Src[i], 0);
136942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		alu.src[i].abs = 1;
137042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
137142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
137242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
137342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
137442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	r = r600_bc_add_alu(ctx->bc, &alu);
137542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
137642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
137742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	r = r600_bc_add_literal(ctx->bc, ctx->value);
137842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
137942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
138042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
138142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
138242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
138342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
1384a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
13857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
13867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
1388a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
13897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
13907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
13917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
13927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1393a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
13947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
13957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
13967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
13977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
13987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
13997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
14007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
14017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
14027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
14037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
14047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
14057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
14067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
14077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1408a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1409a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1410a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1411a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1412a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1413a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1414a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1415a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
1416a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
1417a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]);
1418a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		if (r)
1419a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse			return r;
1420a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		alu.src[i].chan = tgsi_chan(&inst->Src[i], 0);
1421a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
1422a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1423a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1424a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1425a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1426a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1427a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
14285ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
14295ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	if (r)
14305ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		return r;
1431a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
1432a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1433a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1434a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1435a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
1436a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1437a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1438a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1439a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
1440a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1441a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
1442a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1443a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
1444a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1445a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1446a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1447a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
1448a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1449a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1450a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1451a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1452a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1453a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1454e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1455e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1456e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1457a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
1458a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1459a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL_IEEE);
1460a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = tgsi_src(ctx, &inst->Src[1], &alu.src[0]);
1461a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1462a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1463a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[1], 0);
1464a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
1465a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1466a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1467a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1468a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1469a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1470a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1471e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1472e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1473e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1474a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
1475a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1476a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
1477a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
1478a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1479a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1480a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1481a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1482a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1483a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1484e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1485e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1486e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1487a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1488a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1489a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
14900d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
14910d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
14920d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
14930d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu alu;
14940d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu_src r600_src[3];
1495921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
14960d48925a56ad4fb253386110b545abda82a25464Dave Airlie
14970d48925a56ad4fb253386110b545abda82a25464Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
14980d48925a56ad4fb253386110b545abda82a25464Dave Airlie	if (r)
14990d48925a56ad4fb253386110b545abda82a25464Dave Airlie		return r;
15009d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
15019d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
15029d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
15030d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15040d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
15050d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
15060d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1507a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
15080d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
1509cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
15100d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
1511cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
15120d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15130d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0] = r600_src[0];
15140d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
15150d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1516921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
15170d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15180d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2] = r600_src[0];
15190d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].chan = tgsi_chan(&inst->Src[0], i);
15200d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
15210d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
15220d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
15230d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
15240d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
15250d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
1526cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
1527cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie	if (r)
1528cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		return r;
15290d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15300d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
15310d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
15320d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1533a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
15340d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
15350d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
15360d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
15370d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
15380d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15390d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1540cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
15410d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
15420d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1543921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
15440d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
15450d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15460d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
1547cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
15480d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15490d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
15500d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
15510d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
15520d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
15530d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
15540d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
15550d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
15560d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
15570d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1558cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
1559cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1560cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1561cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
1562cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
15639961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
15649961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	if (r)
15659961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse		return r;
1566cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
1567cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1568cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
1569a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
15706c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
1571cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
1572a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1573cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1574cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (r)
1575cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				return r;
1576cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
1577cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
1578cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1579cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
1580cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
1581cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1582cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1583cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
1584cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
1585cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
1586cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
1587cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1588cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
1590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
1594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
1595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
15967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
15977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
15987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
15999d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
16009d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
16019d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
1602de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* do it in 2 step as op3 doesn't support writemask */
1603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
16077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
16087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
1612cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
1614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1621cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1622cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1623cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1624cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
1625cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1626cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
16277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1628cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1629cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
1630cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
16317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
16327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
16337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
16349d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
16359d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
16369d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
1637de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1638de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1639cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1640cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
16417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
16427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1643cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1644cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1645cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
1646cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1647cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
1648cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1649cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
1650cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
1651921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1652cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1653cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1654cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1655cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
1656cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
1657921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1658cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1659cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1660cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1661e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
1662e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
1663e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
1664e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
1665e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
1666e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
1667e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
1668cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
1669cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1672de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1674de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1675de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1676de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1677de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1678cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1679de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
168133241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
168233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
168333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
168433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct r600_bc_tex tex;
1685641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	struct r600_bc_alu alu;
1686641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
1687b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	int r, i;
1688bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
1689bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	boolean src_not_temp = inst->Src[0].Register.File != TGSI_FILE_TEMPORARY;
1690bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	uint32_t lit_vals[4];
1691641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1692641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index;
1693641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1694b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
1695b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
1696b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1697a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1698bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1699bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1700bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1701bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1702b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
1703b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1704b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1705b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1706b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1707b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1708b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1709b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
17109d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
1711b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
1712b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1713a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
1714b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
1715b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].chan = 3;
1716bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
1717bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1718bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1719b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1720b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1721b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1722b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1723b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1724b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1725b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1726b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1727b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1728a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1729921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1730b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
1731b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1732b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1733b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1734b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1735b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1736b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1737b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
173807b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson		src_not_temp = FALSE;
1739b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1740bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1741bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1742bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
1743bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		int src_chan, src2_chan;
1744bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1745bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
1746bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
1747bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1748a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
1749bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			switch (i) {
1750bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 0:
1751bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 2;
1752bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 1;
1753bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1754bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 1:
1755bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 2;
1756bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 0;
1757bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1758bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 2:
1759bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 0;
1760bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 2;
1761bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1762bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 3:
1763bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 1;
1764bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 2;
1765bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
176684b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee			default:
176784b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				assert(0);
176884b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				src_chan = 0;
176984b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				src2_chan = 0;
177084b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				break;
1771bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			}
1772bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1773bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1774bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1775bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], src_chan);
1776bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
1777bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1778bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1779bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], src2_chan);
1780bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
1781bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
1782bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
1783bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
1784bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
1785bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1786bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1787bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1788bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
1789bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1790bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
1791bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1792a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1793bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1794bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 2;
1795bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].abs = 1;
1796bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1797bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 2;
1798bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1799bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
1800bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1801bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1802bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1803bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1804bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
1805bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
1806bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * muladd has no writemask, have to use another temp
1807bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
1808bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1809a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1810bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1811bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1812bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1813bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
1814bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1815bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
1816bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1817bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1818bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
1819bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1820bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1821bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
1822bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1823bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1824bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1825bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1826bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1827bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1828bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1829a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1830bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1831bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1832bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1833bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
1834bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1835bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
1836bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1837bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1838bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
1839bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1840bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1841bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
1842bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1843bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1844bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
1845bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1846bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1847bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1848bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1849bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		lit_vals[0] = fui(1.5f);
1850bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1851bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_literal(ctx->bc, lit_vals);
1852bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1853bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
185407b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson		src_not_temp = FALSE;
1855bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
1856bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1857bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1858bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (src_not_temp) {
1859b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
1860b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1861a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1862b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = src_gpr;
1863a21a2748beb1f42d21e14858eee9a1323d85a00fFredrik Höglund			alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
1864b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1865b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1866b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
1867b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
1868b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1869b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1870b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1871b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1872b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1873b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1874b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
1875bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1876bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
1877bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (opcode == SQ_TEX_INST_SAMPLE &&
1878bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	    (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D))
1879bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		opcode = SQ_TEX_INST_SAMPLE_C;
188033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
188133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	memset(&tex, 0, sizeof(struct r600_bc_tex));
1882bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
1883ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie	tex.sampler_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index;
1884ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie	tex.resource_id = tex.sampler_id;
1885ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie	if (ctx->shader->processor_type == TGSI_PROCESSOR_VERTEX)
1886ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie		tex.resource_id += PIPE_MAX_ATTRIBS;
1887641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
18886c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
18899d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
18909d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
18919d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
18929d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
189333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_x = 0;
189433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_y = 1;
189533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_z = 2;
189633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_w = 3;
18979a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
1898bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
1899bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
1900bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
1901bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
1902bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
1903bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1904bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
190501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
190601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
190701984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
19087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		tex.coord_type_z = 1;
190901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_w = 1;
191001984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
1911bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1912bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)
19135d5f693cefe452bd8bd7e45f8b5d7ed991ae5115Dave Airlie		tex.src_sel_w = 2;
1914bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1915bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	r = r600_bc_add_tex(ctx->bc, &tex);
1916bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
1917bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
1918bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1919bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
1920bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
1921bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
192233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
192333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
1924b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
1925b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
1926b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1928b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct r600_bc_alu alu;
1929b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
1930b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
1931b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
19327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
19337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
19347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
19359d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
19369d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
19379d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
1938b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
1939b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1940b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1941a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
1942921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1943b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
19447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[0];
19457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1946b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[1].neg = 1;
1947b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1948b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1949b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1950b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1951b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1952b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1953b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1954b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1955b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1956b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1957b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
1958b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
1959b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
1960b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1961b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
1962b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1963b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1964a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
1965b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1966b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
19677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[2];
19687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
1969b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1970b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1971b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1972b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1973b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1974b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1975b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1976b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1977b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1978b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1979b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
1980b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
1981b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
1982b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1983b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
1984b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1985b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1986a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1987b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
19887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0] = r600_src[0];
19897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
19907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[1];
19917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[1], i);
1992b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
1993b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
1994b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1995b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1996b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1997b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1998b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1999b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
2000b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2001b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2002b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2003b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	return tgsi_helper_copy(ctx, inst);
2004b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
2005b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
200687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
200787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
200887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
200987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu_src r600_src[3];
201087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu alu;
201187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int use_temp = 0;
201287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
201387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
201487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	r = tgsi_split_constant(ctx, r600_src);
201587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (r)
201687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		return r;
20179d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
20189d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
20199d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
202087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
202187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
202287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		use_temp = 1;
202387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
202487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	for (i = 0; i < 4; i++) {
202587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2026a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
202787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[0] = r600_src[0];
202887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
202987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
203087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[1] = r600_src[2];
203187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
203287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
203387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[2] = r600_src[1];
203487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[2].chan = tgsi_chan(&inst->Src[1], i);
203587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
203687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (use_temp)
203787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.dst.sel = ctx->temp_reg;
203887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		else {
203987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
204087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			if (r)
204187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie				return r;
204287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		}
204387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
204487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
204587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
204687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (i == 3)
204787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
204887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
204987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
205087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
205187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	}
205287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (use_temp)
205387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		return tgsi_helper_copy(ctx, inst);
205487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
205587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
205687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
20570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
20580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
20590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
20600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu_src r600_src[3];
20610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu alu;
20620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
20630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
20640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
20650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
20660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
20670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
20680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
20690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (r)
20700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return r;
20719d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
20729d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
20739d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
20749d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
20750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
20760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2077a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
20780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
20790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[0] = r600_src[0];
20800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
20810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
20820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 2);
20830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
20840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
20850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
20860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
20870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
20880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
20890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
20900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
20910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
20920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
20930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
20940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
20950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[1] = r600_src[1];
20960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
20970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
20980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 1);
20990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
21010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 2);
21020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
21040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 0);
21050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
21070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
21080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
21090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
21100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
21120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
21130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
21140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
21160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
21170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
21180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
21190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
21201e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck
21211e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
21221e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck		if (r)
21231e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck			return r;
21240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
21250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
21270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2128a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
21290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[0] = r600_src[0];
21310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
21320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
21330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
21340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
21360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 2);
21370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
21390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
21400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
21420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
21430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
21440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
21450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[1] = r600_src[1];
21470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
21480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
21490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 2);
21500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
21520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 0);
21530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
21550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 1);
21560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
21580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
21590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
21600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
21610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
21630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
21640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
21650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
21670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
21680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		else {
21690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
21700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			if (r)
21710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie				return r;
21720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
21730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
21740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
21750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
21760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
21770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
21780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
21790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
21800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
21811e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck
21821e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
21831e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck		if (r)
21841e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck			return r;
21850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
21860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
21870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
21880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
21890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
21900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
219136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
219236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
219336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
219436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct r600_bc_alu_src r600_src[3];
219536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct r600_bc_alu alu;
219609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
219736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
219836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
219936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
220036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
220136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2202a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
220336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
220436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
220536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
220636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
220736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
220836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
220936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
221036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
221136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
221236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
221336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
221436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
221536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
221636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
22175ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
22185ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
22195ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
22205ea238b7991331c854e66a16911d616d36965dc9Dave Airlie
2221a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
222236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
222336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
222436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
222536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
222636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
222736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
222836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
222936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
223036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
223136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
22325ea238b7991331c854e66a16911d616d36965dc9Dave Airlie
22335ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
22345ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
22355ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
223636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
223736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
223836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
223936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
224036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
224136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2242a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
224336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0] = r600_src[0];
224436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
224536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
224636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
224736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
224836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
224936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
225036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
225136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//		if (r)
225236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//			return r;
225336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
225436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
225536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
225636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
225736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
225836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
225936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
226036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
22615ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
22625ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
22635ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
226436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
226536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
226636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
226736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
226836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2269a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
227036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
227136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
227236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
227336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
227436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
227536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
227636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
227736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 2;
227836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
227936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
228036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
228136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
228236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
228336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
22845ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
22855ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
22865ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
228736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
228836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
228936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
229036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
229136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
229236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2293a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
229436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
229536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
229636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
229736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
229836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
229936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
230036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
230136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
230236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
230336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
23045ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
23055ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
23065ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
230736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
230836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
230936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
231087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
2311460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
2312460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
2313460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2314460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct r600_bc_alu alu;
2315460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
2316460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2317460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.x = floor(log2(src)); */
2318460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
2319460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2320460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2321460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
2322460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2323460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2324460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2325460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2326460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2327460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2328460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2329460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2330460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2331460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2332460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2333460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2334460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2335460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2336460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2337460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2338460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2339460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2340460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
2341460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
2342460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2343460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2344460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2345460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2346460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2347460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2348460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2349460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2350460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2351460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2352460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2353460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2354460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2355460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2356460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2357460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
235896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck	/* result.y = src.x / (2 ^ floor(log2(src.x))); */
2359460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
2360460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2361460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
236296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
236396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
236496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
236596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
236696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
236796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
236896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
236996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
237096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
237196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
237296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
237396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
237496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
237596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
237696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
237796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
237896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
237996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
238096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
238196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
238296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
238396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
238496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
238596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
238696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
238796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
238896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
238996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
239096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
239196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
239296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
239396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
239496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
239596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
239696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
239796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
239896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
239996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
240096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
240196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
240296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
240396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
240496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
240596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
240696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
240796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
240896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
240996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
241096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
241196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
241296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
241396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
241496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
241596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
241696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
241796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
241896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
241996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
242096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
242196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
242296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
242396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
242496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
242596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
242696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
242796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
242896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
242996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
243096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
243196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
243296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
243396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
243496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
243596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
243696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
243796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
243896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
243996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
244096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
244196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
244296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
244396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
244496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
244596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
244696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
244796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
244896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
244996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
245096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
2451460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2452460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2453460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
2454460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2455460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2456460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2457460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2458460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2459460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2460460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2461460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2462460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2463460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2464460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2465460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2466460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.z = log2(src);*/
2467460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
2468460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2469460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2470460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
2471460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2472460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2473460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2474460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2475460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2476460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2477460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2478460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2479460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 2;
2480460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2481460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2482460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2483460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2484460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2485460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2486460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2487460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2488460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2489460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2490460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2491460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
2492460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
2493460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2494460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2495460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2496460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2497460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2498460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2499460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2500460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
2501460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2502460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2503460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2504460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2505460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2506460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2507460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2508460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2509460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2510460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2511460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2512460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2513460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
2514460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
2515460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
251650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie/* r6/7 only for now */
251747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airliestatic int tgsi_arl(struct r600_shader_ctx *ctx)
251847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
251947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	/* TODO from r600c, ar values don't persist between clauses */
252047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
252147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct r600_bc_alu alu;
252247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
252347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
252447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
252547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR;
252647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
252747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
252847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (r)
252947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		return r;
253047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
253147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
253247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.last = 1;
253347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
2534a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU));
253547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (r)
253647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		return r;
2537c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie	ctx->bc->cf_last->r6xx_uses_waterfall = 1;
253847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
253947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
254047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
254157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
254257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
254357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
254457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct r600_bc_alu alu;
254557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
254657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
254757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
254857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
254957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2550a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
255157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
255257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
255357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
255457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
255557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	        if (i == 0 || i == 3) {
255657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
255757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
255857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
255957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			if (r)
256057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie				return r;
256157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
256257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
256357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
256457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	        if (i == 0 || i == 2) {
256557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
256657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
256757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			r = tgsi_src(ctx, &inst->Src[1], &alu.src[1]);
256857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			if (r)
256957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie				return r;
257057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], i);
257157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
257257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
257357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
257457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
257557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
257657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
257757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
257857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
257957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
258057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2581a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
2582a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2583a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
258409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_bc_alu alu;
2585a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
2586a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2587a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
2588a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
2589a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
2590a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2591a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
2592a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
2593a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
2594a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2595a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2596a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
2597a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
2598a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2599a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
2600a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
2601a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2602a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
2603a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2604a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
2605a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
2606a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
2607a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2608a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2609a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2610a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
2611a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2612a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
2613a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = pops;
2614a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2615a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2616a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
261709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
2618a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
261909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
262009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
262109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
262209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
262309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
262409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
262509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
262609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
262709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
262809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
262909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
263009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
263109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
263209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2633a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
263409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
263509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
263609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
263709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
263809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
263909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
264009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
264109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
264209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
264309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
264409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
2645a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
2646a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
2647a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
264809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
264909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
265009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
265109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
265209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
265309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
265409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
265509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
265609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
265709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
265809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
265909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
266009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
266109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
266209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
266309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
266409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
266509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
266609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
266709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
266809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
266909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
267009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
267109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
267209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
267309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
267409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
267509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
267609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
267709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
267809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
267909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
268009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid,
268109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie						sizeof(struct r600_bc_cf *) * (sp->num_mid + 1));
268209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
268309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
268409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2685a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
268609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
268709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2688a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
268909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
269009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
269109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
269209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
269309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
269409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
269509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
269609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
269709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
269809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
269909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
270009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
270109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
270209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
270309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
270409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
270509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
270609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
270709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
270809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
270909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN);
271009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
271109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
271209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
271309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
271409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
271509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2716a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP);
271709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
271809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO work out offset */
271909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
272009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2721a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
272209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
272309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
272409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
272509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
272609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
272709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
272809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
272909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
273009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
273109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
273209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
273309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
273409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
273509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
273609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
273709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
273809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
273909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
274009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
274109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
274209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
274309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
274409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
274509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
274609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
274709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
274809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
274909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
275009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
275109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
275209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
275309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
275409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
275509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2756a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
275709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2758a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
275909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
276009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
276109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
276209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
2763a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2764a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2765a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2766a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
2767a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2768a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
2769a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
2770a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
277109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
2772a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
2773a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2774a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2775a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2776a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
2777a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2778a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
2779a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
2780a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
2781a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
2782a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
2783a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2784a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
2785a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
2786a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
2787a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
278809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
2789a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
279009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
279109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
279209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
279309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
279409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
279509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
279609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
279709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2798a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
279909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
280009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
2801a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
280209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
280309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
280409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
280509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
280609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
280709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
280809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
280909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
281009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2811a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
281209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
281309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
281409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
281509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
281609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
281709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
281809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
281909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
282009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
282109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
282209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
282309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
282409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
282509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
282609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
282709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
282809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
282909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
283009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO add LOOPRET support */
283109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
283209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
283309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
283409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
283509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
283609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
283709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
283809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
283909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
284009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
284109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
284209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
284309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
284409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
284509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
284609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
284709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
284809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
284909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
285009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
285109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
285209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
285309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
285409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
285509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
285609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
285709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
2858a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2859a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2860a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2861de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
286247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_arl},
2863de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
28640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
2865df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
2866df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
2867df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
2868df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
2869df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
2870df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
2871df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
287242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
287336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
2874460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
2875de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
2876de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
2877cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
2878cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
287957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
2880dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
2881de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
2882d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
2883be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
2884de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
2885de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
2886b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
2887de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2888de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2889de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2890de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2891de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2892de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2893de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
28943af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
2895de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
28963af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
2897de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
28987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
28994558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
2900a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
29010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
2902de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2903de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
29047a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
2905de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2906e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
290788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
29083af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
29093af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
29104502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
2911de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2912de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2913de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2914de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2915de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
29160d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
2917de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
29180d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
291988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
2920d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
29210d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
2922de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2923b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
2924de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2925b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
2926de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2927de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2928de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2929de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2930de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2931de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2932de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2933de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2934de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2935de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
29360d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
293787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
293892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
2939d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
2940de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2941de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2942cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
2943ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
294409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
2945a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
2946de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2947de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2949a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
2950a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
2951de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2952de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2953de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2954de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2955de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2956de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2957de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2958de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
29594558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate},
2960de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2961de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2962de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2963de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2964de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2967de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2968de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2969de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
297009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
2971de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2972de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
297309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
2974de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
297509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
2976de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2977de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2978de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2979de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2980de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2981de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2982de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2983de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2984de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2985de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2986de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2987de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2988de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2989de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2990de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2991de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2992094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
2993de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
2994de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2995de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2996de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2997de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2998de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2999de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3000de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3001de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3002de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3003de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3004de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3005de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3006de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3007de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3008de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3009de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3010de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3011de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3012de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3013de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3014de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3015de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3016de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3017de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3018de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3019de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3020de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3021de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3022de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3023de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
302450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
302550526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
302650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
302750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
302850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
302950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
303050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate},
303150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
303250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
303350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
303450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
303550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
303650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
303750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
303850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
303950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
304050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
304150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
304250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
304350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
304450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
304550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
304650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
304750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
304850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
304950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
305050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
305150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
305250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
305350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
305450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
305550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
305650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
305750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
305850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
305950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
306050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
306150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
306250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
306350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
306450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
306550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
306650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
306750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
306850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
306950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
307050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
307150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
307250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
307350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
307450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
307550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
307650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
307750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
307850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
307950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
308050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
308250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
308450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
309050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
309150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
309250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
309350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
309450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
309550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
309650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
309750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
309850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
309950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
310050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3101ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
310250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
310350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
310450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
310550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
310650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
310750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
310850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
310950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
311050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
311150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
311250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
311350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
311450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
311550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
311650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
311750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate},
311850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
311950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
312050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
312150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
312250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
312350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
312450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
312550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
312650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
312750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
312850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
312950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
313050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
313150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
313250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
313350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
313450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
313550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
313650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
313750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
313850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
313950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
314250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
315050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
315150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
315250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
315350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
315450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
315550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
315650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
315750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
315850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
315950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
3182