sm4_to_tgsi.cpp revision 0e40b41ceec15d97507fe85343daad54aa1c4824
192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri/**************************************************************************
292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Copyright 2010 Luca Barbieri
492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Permission is hereby granted, free of charge, to any person obtaining
692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * a copy of this software and associated documentation files (the
792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * "Software"), to deal in the Software without restriction, including
892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * without limitation the rights to use, copy, modify, merge, publish,
992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * distribute, sublicense, and/or sell copies of the Software, and to
1092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * permit persons to whom the Software is furnished to do so, subject to
1192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * the following conditions:
1292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
1392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * The above copyright notice and this permission notice (including the
1492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * next paragraph) shall be included in all copies or substantial
1592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * portions of the Software.
1692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
1792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
2092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
2192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
2292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
2392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
2592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri **************************************************************************/
2692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
274babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri#include "d3d1xstutil.h"
28e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri#include "sm4.h"
2992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "tgsi/tgsi_ureg.h"
3092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include <vector>
3192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
3292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if 1
3392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define check(x) assert(x)
3492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define fail(x) assert(0 && (x))
3592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#else
3692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define check(x) do {if(!(x)) throw(#x);} while(0)
3792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define fail(x) throw(x)
3892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
3992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
40e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieristatic unsigned sm4_to_pipe_interpolation[] =
4192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
4292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	TGSI_INTERPOLATE_PERSPECTIVE, /* UNDEFINED */
4392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	TGSI_INTERPOLATE_CONSTANT,
4492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	TGSI_INTERPOLATE_PERSPECTIVE, /* LINEAR */
4592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	TGSI_INTERPOLATE_PERSPECTIVE, /* LINEAR_CENTROID */
4692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	TGSI_INTERPOLATE_LINEAR, /* LINEAR_NOPERSPECTIVE */
4792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	TGSI_INTERPOLATE_LINEAR, /* LINEAR_NOPERSPECTIVE_CENTROID */
4892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
4992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	// Added in D3D10.1
5092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	TGSI_INTERPOLATE_PERSPECTIVE, /* LINEAR_SAMPLE */
5192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	TGSI_INTERPOLATE_LINEAR, /* LINEAR_NOPERSPECTIVE_SAMPLE */
5292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
5392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
54e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieristatic int sm4_to_pipe_sv[] =
5592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
5692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	-1,
5792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	TGSI_SEMANTIC_POSITION,
5892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	-1, /*TGSI_SEMANTIC_CLIP_DISTANCE */
5992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	-1, /*TGSI_SEMANTIC_CULL_DISTANCE */
6092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	-1, /*TGSI_SEMANTIC_RENDER_TARGET_ARRAY_INDEX */
6192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	-1, /*TGSI_SEMANTIC_VIEWPORT_ARRAY_INDEX */
6292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	-1, /*TGSI_SEMANTIC_VERTEXID,*/
6392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	TGSI_SEMANTIC_PRIMID,
6492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	TGSI_SEMANTIC_INSTANCEID,
6592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	TGSI_SEMANTIC_FACE,
6692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	-1, /*TGSI_SEMANTIC_SAMPLE_INDEX*/
6792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
6892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
69e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieristruct sm4_to_tgsi_converter
7092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
7192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	struct ureg_program* ureg;
7292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	std::vector<struct ureg_dst> temps;
7392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	std::vector<struct ureg_dst> outputs;
7492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	std::vector<struct ureg_src> inputs;
7592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	std::vector<struct ureg_src> samplers;
7692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	std::vector<std::pair<unsigned, unsigned> > targets; // first is normal, second shadow/comparison
7792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	std::vector<unsigned> sampler_modes; // 0 = normal, 1 = shadow/comparison
7892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	std::vector<std::pair<unsigned, unsigned> > loops;
79e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	sm4_insn* insn;
80e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	struct sm4_program& program;
81e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	std::vector<unsigned> sm4_to_tgsi_insn_num;
82e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	std::vector<std::pair<unsigned, unsigned> > label_to_sm4_insn_num;
8392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	bool in_sub;
8492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	bool avoid_txf;
8592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	bool avoid_int;
8692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
87e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	sm4_to_tgsi_converter(struct sm4_program& program)
8892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: program(program)
8992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
9092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		avoid_txf = true;
9192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		avoid_int = false;
9292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
9392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
94e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	struct ureg_dst _reg(sm4_op& op)
9592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
9692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		switch(op.file)
9792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
98e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		case SM4_FILE_NULL:
9992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
10092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			struct ureg_dst d;
10192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			memset(&d, 0, sizeof(d));
10292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			d.File = TGSI_FILE_NULL;
10392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return d;
10492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
105e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		case SM4_FILE_TEMP:
10692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			check(op.has_simple_index());
10792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			check(op.indices[0].disp < temps.size());
10892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return temps[op.indices[0].disp];
109e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		case SM4_FILE_OUTPUT:
11092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			check(op.has_simple_index());
11192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			check(op.indices[0].disp < outputs.size());
11292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return outputs[op.indices[0].disp];
11392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		default:
11492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			check(0);
11592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return ureg_dst_undef();
11692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
11792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
11892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
11992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	struct ureg_dst _dst(unsigned i = 0)
12092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
12192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		check(i < insn->num_ops);
122e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		sm4_op& op = *insn->ops[i];
123e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		check(op.mode == SM4_OPERAND_MODE_MASK || op.mode == SM4_OPERAND_MODE_SCALAR);
12492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		struct ureg_dst d = ureg_writemask(_reg(op), op.mask);
12592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(insn->insn.sat)
12692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			d = ureg_saturate(d);
12792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return d;
12892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
12992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
13092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	struct ureg_src _src(unsigned i)
13192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
13292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		check(i < insn->num_ops);
133e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		sm4_op& op = *insn->ops[i];
13492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		struct ureg_src s;
13592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		switch(op.file)
13692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
137e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		case SM4_FILE_IMMEDIATE32:
13892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			s = ureg_imm4f(ureg, op.imm_values[0].f32, op.imm_values[1].f32, op.imm_values[2].f32, op.imm_values[3].f32);
13992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			break;
140e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		case SM4_FILE_INPUT:
1414babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri			check(op.is_index_simple(0));
1424babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri			check(op.num_indices == 1 || op.num_indices == 2);
1434babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri			// TODO: is this correct, or are incorrectly swapping the two indices in the GS case?
1444babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri			check(op.indices[op.num_indices - 1].disp < inputs.size());
1454babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri			s = inputs[op.indices[op.num_indices - 1].disp];
1464babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri			if(op.num_indices == 2)
1474babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri			{
1484babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri				s.Dimension = 1;
1494babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri				s.DimensionIndex = op.indices[0].disp;
1504babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri			}
15192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			break;
152e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		case SM4_FILE_CONSTANT_BUFFER:
15392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			// TODO: indirect addressing
15492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			check(op.num_indices == 2);
15592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			check(op.is_index_simple(0));
15692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			check(op.is_index_simple(1));
15792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			s = ureg_src_register(TGSI_FILE_CONSTANT, (unsigned)op.indices[1].disp);
15892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			s.Dimension = 1;
15992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			s.DimensionIndex = op.indices[0].disp;
16092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			break;
16192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		default:
16292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			s = ureg_src(_reg(op));
16392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			break;
16492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
165e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		if(op.mode == SM4_OPERAND_MODE_SWIZZLE || op.mode == SM4_OPERAND_MODE_SCALAR)
16692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			s = ureg_swizzle(s, op.swizzle[0], op.swizzle[1], op.swizzle[2], op.swizzle[3]);
16792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		else
16892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
16992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			/* immediates are masked to show needed values */
170e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			check(op.file == SM4_FILE_IMMEDIATE32 || op.file == SM4_FILE_IMMEDIATE64);
17192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
17292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(op.abs)
17392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			s = ureg_abs(s);
17492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(op.neg)
17592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			s = ureg_negate(s);
17692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return s;
17792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	};
17892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
179e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	int _idx(sm4_file file, unsigned i = 0)
18092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
18192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		check(i < insn->num_ops);
182e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		sm4_op& op = *insn->ops[i];
18392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		check(op.file == file);
18492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		check(op.has_simple_index());
18592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return (int)op.indices[0].disp;
18692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
18792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
18892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	int _texslot(bool have_sampler = true)
18992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
19092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		std::map<std::pair<int, int>, int>::iterator i;
191e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		i = program.resource_sampler_to_slot.find(std::make_pair(_idx(SM4_FILE_RESOURCE, 2), have_sampler ? _idx(SM4_FILE_SAMPLER, 3) : -1));
19292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		check(i != program.resource_sampler_to_slot.end());
19392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return i->second;
19492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
19592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
19692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	unsigned tex_target(unsigned texslot)
19792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
19892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		unsigned mode = sampler_modes[program.slot_to_sampler[texslot]];
19992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		unsigned target;
20092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(mode)
20192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			target = targets[program.slot_to_resource[texslot]].second;
20292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		else
20392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			target = targets[program.slot_to_resource[texslot]].first;
20492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		check(target);
20592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return target;
20692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
20792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
20892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	std::vector<struct ureg_dst> insn_tmps;
20992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
21092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	struct ureg_dst _tmp()
21192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
21292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		struct ureg_dst t = ureg_DECL_temporary(ureg);
21392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		insn_tmps.push_back(t);
21492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return t;
21592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
21692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
21792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	struct ureg_dst _tmp(struct ureg_dst d)
21892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
21992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(d.File == TGSI_FILE_TEMPORARY)
22092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return d;
22192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		else
22292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return ureg_writemask(_tmp(), d.WriteMask);
22392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
22492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
225e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri#define OP1_(d, g) case SM4_OPCODE_##d: ureg_##g(ureg, _dst(), _src(1)); break
226e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri#define OP2_(d, g) case SM4_OPCODE_##d: ureg_##g(ureg, _dst(), _src(1), _src(2)); break
227e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri#define OP3_(d, g) case SM4_OPCODE_##d: ureg_##g(ureg, _dst(), _src(1), _src(2), _src(3)); break
22892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define OP1(n) OP1_(n, n)
22992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define OP2(n) OP2_(n, n)
23092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define OP3(n) OP3_(n, n)
2316c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri#define OP_CF(d, g) case SM4_OPCODE_##d: ureg_##g(ureg, &label); label_to_sm4_insn_num.push_back(std::make_pair(label, program.cf_insn_linked[insn_num])); break;
23292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
23392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void translate_insns(unsigned begin, unsigned end)
23492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
23592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(unsigned insn_num = begin; insn_num < end; ++insn_num)
23692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
237e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			sm4_to_tgsi_insn_num[insn_num] = ureg_get_instruction_number(ureg);
23892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			unsigned label;
23992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			insn = program.insns[insn_num];
24092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			bool ok;
24192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			ok = true;
24292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			switch(insn->opcode)
24392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
24492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			// trivial instructions
245e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_NOP:
24692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
24792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP1(MOV);
24892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
24992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			// float
25092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP2(ADD);
25192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP2(MUL);
25292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP3(MAD);
25392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP2(DIV);
25492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP1(FRC);
25592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP1(RCP);
25692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP2(MIN);
25792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP2(MAX);
25892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP2_(LT, SLT);
25992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP2_(GE, SGE);
26092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP2_(EQ, SEQ);
26192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP2_(NE, SNE);
26292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
26392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			// bitwise
26492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP1(NOT);
26592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP2(AND);
26692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP2(OR);
26792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP2(XOR);
26892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
26992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			// special mathematical
27092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP2(DP2);
27192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP2(DP3);
27292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP2(DP4);
27392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP1(RSQ);
27492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP1_(LOG, LG2);
27592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP1_(EXP, EX2);
27692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
27792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			// rounding
27892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP1_(ROUND_NE, ROUND);
27992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP1_(ROUND_Z, TRUNC);
28092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP1_(ROUND_PI, CEIL);
28192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP1_(ROUND_NI, FLR);
28292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
28392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			// cross-thread
28492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP1_(DERIV_RTX, DDX);
28592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP1_(DERIV_RTX_COARSE, DDX);
28692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP1_(DERIV_RTX_FINE, DDX);
28792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP1_(DERIV_RTY, DDY);
28892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP1_(DERIV_RTY_COARSE, DDY);
28992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP1_(DERIV_RTY_FINE, DDY);
290e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_EMIT:
29192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_EMIT(ureg);
29292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
293e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_CUT:
29492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_ENDPRIM(ureg);
29592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
296e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_EMITTHENCUT:
29792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_EMIT(ureg);
29892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_ENDPRIM(ureg);
29992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
30092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
30192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			// non-trivial instructions
302e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_MOVC:
30392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				/* CMP checks for < 0, but MOVC checks for != 0
30492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				 * but fortunately, x != 0 is equivalent to -abs(x) < 0
30592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				 * XXX: can test_nz apply to this?!
30692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				 */
30792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_CMP(ureg, _dst(), ureg_negate(ureg_abs(_src(1))), _src(2), _src(3));
30892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
309e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_SQRT:
31092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
31192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				struct ureg_dst d = _dst();
31292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				struct ureg_dst t = _tmp(d);
31392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_RSQ(ureg, t, _src(1));
31492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_RCP(ureg, d, ureg_src(t));
31592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
31692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
317e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_SINCOS:
31892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
31992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				struct ureg_dst s = _dst(0);
32092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				struct ureg_dst c = _dst(1);
32192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				struct ureg_src v = _src(2);
32292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(s.File != TGSI_FILE_NULL)
32392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ureg_SIN(ureg, s, v);
32492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(c.File != TGSI_FILE_NULL)
32592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ureg_COS(ureg, c, v);
32692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
32792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
32892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
32992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			// control flow
330e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_DISCARD:
33192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_KIL(ureg, _src(0));
33292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
33392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP_CF(LOOP, BGNLOOP);
33492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP_CF(ENDLOOP, ENDLOOP);
335e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_BREAK:
33692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_BRK(ureg);
33792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
338e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_BREAKC:
33992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				// XXX: can test_nz apply to this?!
34092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_BREAKC(ureg, _src(0));
34192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
342e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_CONTINUE:
34392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_CONT(ureg);
34492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
345e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_CONTINUEC:
34692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				// XXX: can test_nz apply to this?!
34792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_IF(ureg, _src(0), &label);
34892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_CONT(ureg);
34992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_fixup_label(ureg, label, ureg_get_instruction_number(ureg));
35092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_ENDIF(ureg);
35192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
352e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_SWITCH:
35392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_SWITCH(ureg, _src(0));
35492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
355e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_CASE:
35692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_CASE(ureg, _src(0));
35792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
358e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_DEFAULT:
35992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_DEFAULT(ureg);
36092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
361e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_ENDSWITCH:
36292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_ENDSWITCH(ureg);
36392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
364e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_CALL:
36592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_CAL(ureg, &label);
366e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri				label_to_sm4_insn_num.push_back(std::make_pair(label, program.label_to_insn_num[_idx(SM4_FILE_LABEL)]));
36792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
368e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_LABEL:
36992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(in_sub)
37092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ureg_ENDSUB(ureg);
37192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				else
37292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ureg_END(ureg);
37392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_BGNSUB(ureg);
37492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				in_sub = true;
37592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
376e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_RET:
37792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(in_sub || insn_num != (program.insns.size() - 1))
37892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ureg_RET(ureg);
37992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
380e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_RETC:
38192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_IF(ureg, _src(0), &label);
38292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(insn->insn.test_nz)
38392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ureg_RET(ureg);
38492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_fixup_label(ureg, label, ureg_get_instruction_number(ureg));
38592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(!insn->insn.test_nz)
38692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
38792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ureg_ELSE(ureg, &label);
38892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ureg_RET(ureg);
38992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ureg_fixup_label(ureg, label, ureg_get_instruction_number(ureg));
39092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
39192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_ENDIF(ureg);
39292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
39392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			OP_CF(ELSE, ELSE);
394e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_ENDIF:
39592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_ENDIF(ureg);
39692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
397e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_IF:
39892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(insn->insn.test_nz)
39992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
40092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ureg_IF(ureg, _src(0), &label);
401e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri					label_to_sm4_insn_num.push_back(std::make_pair(label, program.cf_insn_linked[insn_num]));
40292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
40392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				else
40492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
40592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					unsigned linked = program.cf_insn_linked[insn_num];
406e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri					if(program.insns[linked]->opcode == SM4_OPCODE_ENDIF)
40792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					{
40892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						ureg_IF(ureg, _src(0), &label);
40992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						ureg_fixup_label(ureg, label, ureg_get_instruction_number(ureg));
41092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						ureg_ELSE(ureg, &label);
411e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri						label_to_sm4_insn_num.push_back(std::make_pair(label, linked));
41292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					}
41392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					else
41492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					{
41592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						/* we have to swap the branches in this case (fun!)
41692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						 * TODO: maybe just emit a SEQ 0?
41792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						 * */
41892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						unsigned endif = program.cf_insn_linked[linked];
41992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
42092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						ureg_IF(ureg, _src(0), &label);
421e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri						label_to_sm4_insn_num.push_back(std::make_pair(label, linked));
42292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
42392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						translate_insns(linked + 1, endif);
42492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
425e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri						sm4_to_tgsi_insn_num[linked] = ureg_get_instruction_number(ureg);
42692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						ureg_ELSE(ureg, &label);
427e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri						label_to_sm4_insn_num.push_back(std::make_pair(label, endif));
42892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
42992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						translate_insns(insn_num + 1, linked);
43092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
43192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						insn_num = endif - 1;
43292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						goto next;
43392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					}
43492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
43592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
436e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_RESINFO:
43792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
43892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				std::map<int, int>::iterator i;
439e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri				i = program.resource_to_slot.find(_idx(SM4_FILE_RESOURCE, 2));
44092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				check(i != program.resource_to_slot.end());
44192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				unsigned texslot = i->second;
44292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
44392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				// no driver actually provides this, unfortunately
44492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_TXQ(ureg, _dst(), tex_target(texslot), _src(1), samplers[texslot]);
44592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
44692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			};
44792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			// TODO: sample offset, sample index
448e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_LD: // dst, coord_int, res; mipmap level in last coord_int arg (ouch)
449e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_LD_MS:
45092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
45192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				unsigned texslot = _texslot(false);
452d83b7a69a0aeece9d7ba68c1b161656988009bfaLuca Barbieri				unsigned dim = 0;
45392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				switch(targets[texslot].first)
45492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
45592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				case TGSI_TEXTURE_1D:
45692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					dim = 1;
45792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					break;
45892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				case TGSI_TEXTURE_2D:
45992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				case TGSI_TEXTURE_RECT:
46092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					dim = 2;
46192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					break;
46292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				case TGSI_TEXTURE_3D:
46392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					dim = 3;
46492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					break;
46592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				default:
46692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					check(0);
46792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
46892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				struct ureg_dst tmp = _tmp();
46992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(avoid_txf)
47092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
47192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					struct ureg_src texcoord;
47292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					if(!avoid_int)
47392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					{
47492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						ureg_I2F(ureg, tmp, _src(1));
47592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						texcoord = ureg_src(tmp);
47692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					}
47792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					else
47892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						texcoord = _src(1);
47992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
48092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ureg_TXL(ureg, _dst(), tex_target(texslot), ureg_swizzle(texcoord, 0, 1, 2, dim), samplers[texslot]);
48192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
48292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				else
48392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ureg_TXF(ureg, _dst(), tex_target(texslot), ureg_swizzle(_src(1), 0, 1, 2, dim), samplers[texslot]);
48492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
48592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
486e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_SAMPLE: // dst, coord, res, samp
48792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
48892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				unsigned texslot = _texslot();
48992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_TEX(ureg, _dst(), tex_target(texslot), _src(1), samplers[texslot]);
49092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
49192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
492e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_SAMPLE_B: // dst, coord, res, samp, bias.x
49392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
49492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				unsigned texslot = _texslot();
49592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				struct ureg_dst tmp = _tmp();
49692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_XYZ), _src(1));
49792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_W), ureg_swizzle(_src(4), 0, 0, 0, 0));
49892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_TXB(ureg, _dst(), tex_target(texslot), ureg_src(tmp), samplers[texslot]);
49992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
50092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
501e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_SAMPLE_C: // dst, coord, res, samp, comp.x
50292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
50392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				unsigned texslot = _texslot();
50492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				struct ureg_dst tmp = _tmp();
50592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_XY), _src(1));
50692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_Z), ureg_swizzle(_src(4), 0, 0, 0, 0));
50792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_TEX(ureg, _dst(), tex_target(texslot), ureg_src(tmp), samplers[texslot]);
50892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
50992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
510e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_SAMPLE_C_LZ: // dst, coord, res, samp, comp.x
51192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
51292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				unsigned texslot = _texslot();
51392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				struct ureg_dst tmp = _tmp();
51492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_XY), _src(1));
51592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_Z), ureg_swizzle(_src(4), 0, 0, 0, 0));
51692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_W), ureg_imm1f(ureg, 0.0));
51792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_TXL(ureg, _dst(), tex_target(texslot), ureg_src(tmp), samplers[texslot]);
51892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
51992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
520e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_SAMPLE_D: // dst, coord, res, samp, ddx, ddy
52192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
52292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				unsigned texslot = _texslot();
52392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_TXD(ureg, _dst(), tex_target(texslot), _src(1), samplers[texslot], _src(4), _src(5));
52492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
52592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
526e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_SAMPLE_L: // dst, coord, res, samp, bias.x
52792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
52892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				unsigned texslot = _texslot();
52992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				struct ureg_dst tmp = _tmp();
53092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_XYZ), _src(1));
53192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_W), ureg_swizzle(_src(4), 0, 0, 0, 0));
53292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_TXL(ureg, _dst(), tex_target(texslot), ureg_src(tmp), samplers[texslot]);
53392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
53492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
53592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			default:
53692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ok = false;
53792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
53892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
53992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
54092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			if(!ok && !avoid_int)
54192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
54292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ok = true;
54392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				switch(insn->opcode)
54492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
54592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				// integer
54692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP1_(ITOF, I2F);
54792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP1_(FTOI, F2I);
54892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(IADD, UADD);
54992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP1(INEG);
55092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(IMUL, UMUL);
55192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP3_(IMAD, UMAD);
55292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(ISHL, SHL);
55392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(ISHR, ISHR);
55492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2(IMIN);
55592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2(IMAX);
55692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(ILT, ISLT);
55792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(IGE, ISGE);
55892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(IEQ, USEQ);
55992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(INE, USNE);
56092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
56192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				// unsigned
56292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP1_(UTOF, U2F);
56392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP1_(FTOU, F2U);
56492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2(UMUL);
56592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP3(UMAD);
56692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2(UMIN);
56792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2(UMAX);
56892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(ULT, USLT);
56992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(UGE, USGE);
57092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2(USHR);
57192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
572e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri				case SM4_OPCODE_UDIV:
57392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
57492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					struct ureg_dst q = _dst(0);
57592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					struct ureg_dst r = _dst(1);
57692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					struct ureg_src a = _src(2);
57792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					struct ureg_src b = _src(3);
57892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					if(q.File != TGSI_FILE_NULL)
57992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						ureg_UDIV(ureg, q, a, b);
58092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					if(r.File != TGSI_FILE_NULL)
58192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						ureg_UMOD(ureg, r, a, b);
58292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					break;
58392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
58492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				default:
58592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ok = false;
58692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
58792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
58892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
58992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			if(!ok && avoid_int)
59092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
59192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ok = true;
59292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				switch(insn->opcode)
59392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
594e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri				case SM4_OPCODE_ITOF:
595e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri				case SM4_OPCODE_UTOF:
59692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					break;
59792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP1_(FTOI, TRUNC);
59892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP1_(FTOU, FLR);
59992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				// integer
60092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(IADD, ADD);
60192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(IMUL, MUL);
60292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP3_(IMAD, MAD);
60392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(MIN, MIN);
60492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(MAX, MAX);
60592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(ILT, SLT);
60692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(IGE, SGE);
60792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(IEQ, SEQ);
60892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(INE, SNE);
60992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
61092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				// unsigned
61192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(UMUL, MUL);
61292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP3_(UMAD, MAD);
61392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(UMIN, MIN);
61492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(UMAX, MAX);
61592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(ULT, SLT);
61692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				OP2_(UGE, SGE);
61792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
618e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri				case SM4_OPCODE_INEG:
61992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ureg_MOV(ureg, _dst(), ureg_negate(_src(1)));
62092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					break;
621e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri				case SM4_OPCODE_ISHL:
62292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
62392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					struct ureg_dst d = _dst();
62492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					struct ureg_dst t = _tmp(d);
62592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ureg_EX2(ureg, t, _src(2));
62692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ureg_MUL(ureg, d, ureg_src(t), _src(1));
62792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					break;
62892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
629e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri				case SM4_OPCODE_ISHR:
630e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri				case SM4_OPCODE_USHR:
63192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
63292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					struct ureg_dst d = _dst();
63392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					struct ureg_dst t = _tmp(d);
63492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ureg_EX2(ureg, t, ureg_negate(_src(2)));
63592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ureg_MUL(ureg, t, ureg_src(t), _src(1));
63692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ureg_FLR(ureg, d, ureg_src(t));
63792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					break;
63892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
639e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri				case SM4_OPCODE_UDIV:
64092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
64192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					struct ureg_dst q = _dst(0);
64292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					struct ureg_dst r = _dst(1);
64392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					struct ureg_src a = _src(2);
64492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					struct ureg_src b = _src(3);
64592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					struct ureg_dst f = _tmp();
64692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ureg_DIV(ureg, f, a, b);
64792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					if(q.File != TGSI_FILE_NULL)
64892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						ureg_FLR(ureg, q, ureg_src(f));
64992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					if(r.File != TGSI_FILE_NULL)
65092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					{
65192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						ureg_FRC(ureg, f, ureg_src(f));
65292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						ureg_MUL(ureg, r, ureg_src(f), b);
65392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					}
65492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					break;
65592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
65692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				default:
65792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ok = false;
65892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
65992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
66092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
66192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			check(ok);
66292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
66392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			if(!insn_tmps.empty())
66492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
66592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				for(unsigned i = 0; i < insn_tmps.size(); ++i)
66692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					ureg_release_temporary(ureg, insn_tmps[i]);
66792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				insn_tmps.clear();
66892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
66992617aeac109481258f0c3863d09c1b8903d438bLuca Barbierinext:;
67092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
67192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
67292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
67392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void* do_translate()
67492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
67592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		unsigned processor;
67692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		switch(program.version.type)
67792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
67892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		case 0:
67992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			processor = TGSI_PROCESSOR_FRAGMENT;
68092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			break;
68192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		case 1:
68292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			processor = TGSI_PROCESSOR_VERTEX;
68392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			break;
68492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		case 2:
68592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			processor = TGSI_PROCESSOR_GEOMETRY;
68692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			break;
68792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		default:
68892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			fail("Tessellation and compute shaders not yet supported");
68992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return 0;
69092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
69192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
692e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		if(!sm4_link_cf_insns(program))
69392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			fail("Malformed control flow");
694e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		if(!sm4_find_labels(program))
69592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			fail("Failed to locate labels");
696e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		if(!sm4_allocate_resource_sampler_pairs(program))
69792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			fail("Unsupported (indirect?) accesses to resources and/or samplers");
69892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
69992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		ureg = ureg_create(processor);
70092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
70192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		in_sub = false;
70292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
70392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(unsigned i = 0; i < program.slot_to_resource.size(); ++i)
70492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			samplers.push_back(ureg_DECL_sampler(ureg, i));
70592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
706e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		sm4_to_tgsi_insn_num.resize(program.insns.size());
70792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(unsigned insn_num = 0; insn_num < program.dcls.size(); ++insn_num)
70892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
709e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			sm4_dcl& dcl = *program.dcls[insn_num];
71092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			int idx = -1;
7114babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri			if(dcl.op.get() && dcl.op->is_index_simple(0))
71292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				idx = dcl.op->indices[0].disp;
71392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			switch(dcl.opcode)
71492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
715e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_DCL_GLOBAL_FLAGS:
71692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
717e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_DCL_TEMPS:
71892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				for(unsigned i = 0; i < dcl.num; ++i)
71992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					temps.push_back(ureg_DECL_temporary(ureg));
72092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
721e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_DCL_INPUT:
72292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				check(idx >= 0);
72392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(processor == TGSI_PROCESSOR_VERTEX)
7240e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri				{
7250e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri					if(inputs.size() <= (unsigned)idx)
7260e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri						inputs.resize(idx + 1);
72792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					inputs[idx] = ureg_DECL_vs_input(ureg, idx);
7280e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri				}
7294babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri				else if(processor == TGSI_PROCESSOR_GEOMETRY)
7304babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri				{
7314babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri					// TODO: is this correct?
7324babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri					unsigned gsidx = dcl.op->indices[1].disp;
7330e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri					if(inputs.size() <= (unsigned)gsidx)
7340e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri						inputs.resize(gsidx + 1);
7354babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri					inputs[gsidx] = ureg_DECL_gs_input(ureg, gsidx, TGSI_SEMANTIC_GENERIC, gsidx);
7364babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri				}
73792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				else
73892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					check(0);
73992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
740e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_DCL_INPUT_PS:
74192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				check(idx >= 0);
74292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(inputs.size() <= (unsigned)idx)
74392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					inputs.resize(idx + 1);
744e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri				inputs[idx] = ureg_DECL_fs_input(ureg, TGSI_SEMANTIC_GENERIC, idx, sm4_to_pipe_interpolation[dcl.dcl_input_ps.interpolation]);
74592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
746e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_DCL_OUTPUT:
74792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				check(idx >= 0);
74892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(outputs.size() <= (unsigned)idx)
74992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					outputs.resize(idx + 1);
75092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(processor == TGSI_PROCESSOR_FRAGMENT)
75192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					outputs[idx] = ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, idx);
75292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				else
75392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					outputs[idx] = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, idx);
75492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
755e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_DCL_INPUT_SIV:
756e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_DCL_INPUT_SGV:
757e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_DCL_INPUT_PS_SIV:
758e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_DCL_INPUT_PS_SGV:
75992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				check(idx >= 0);
76092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(inputs.size() <= (unsigned)idx)
76192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					inputs.resize(idx + 1);
76292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				// TODO: is this correct?
763e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri				inputs[idx] = ureg_DECL_system_value(ureg, idx, sm4_to_pipe_sv[dcl.sv], 0);
76492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
765e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_DCL_OUTPUT_SIV:
766e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_DCL_OUTPUT_SGV:
76792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				check(idx >= 0);
76892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(outputs.size() <= (unsigned)idx)
76992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					outputs.resize(idx + 1);
770e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri				check(sm4_to_pipe_sv[dcl.sv] >= 0);
771e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri				outputs[idx] = ureg_DECL_output(ureg, sm4_to_pipe_sv[dcl.sv], 0);
77292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
773e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_DCL_RESOURCE:
77492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				check(idx >= 0);
77592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(targets.size() <= (unsigned)idx)
77692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					targets.resize(idx + 1);
77792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				switch(dcl.dcl_resource.target)
77892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
779e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri				case SM4_TARGET_TEXTURE1D:
78092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					targets[idx].first = TGSI_TEXTURE_1D;
78192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					targets[idx].second = TGSI_TEXTURE_SHADOW1D;
78292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					break;
783e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri				case SM4_TARGET_TEXTURE2D:
78492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					targets[idx].first = TGSI_TEXTURE_2D;
78592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					targets[idx].second = TGSI_TEXTURE_SHADOW2D;
78692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					break;
787e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri				case SM4_TARGET_TEXTURE3D:
78892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					targets[idx].first = TGSI_TEXTURE_3D;
78992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					targets[idx].second = 0;
79092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					break;
791e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri				case SM4_TARGET_TEXTURECUBE:
79292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					targets[idx].first = TGSI_TEXTURE_CUBE;
79392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					targets[idx].second = 0;
79492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					break;
79592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				default:
7960e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri					// HACK to make SimpleSample10 work
7970e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri					//check(0);
7980e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri					targets[idx].first = TGSI_TEXTURE_2D;
7990e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri					targets[idx].second = TGSI_TEXTURE_SHADOW2D;
8000e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri					break;
80192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
80292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
803e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_DCL_SAMPLER:
80492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				check(idx >= 0);
80592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(sampler_modes.size() <= (unsigned)idx)
80692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					sampler_modes.resize(idx + 1);
80792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				check(!dcl.dcl_sampler.mono);
80892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				sampler_modes[idx] = dcl.dcl_sampler.shadow;
80992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
810e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPCODE_DCL_CONSTANT_BUFFER:
81192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				check(dcl.op->num_indices == 2);
81292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				check(dcl.op->is_index_simple(0));
81392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				check(dcl.op->is_index_simple(1));
81492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				idx = dcl.op->indices[0].disp;
81592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ureg_DECL_constant2D(ureg, 0, (unsigned)dcl.op->indices[1].disp - 1, idx);
81692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
8174babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri			case SM4_OPCODE_DCL_GS_INPUT_PRIMITIVE:
8184babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri				ureg_property_gs_input_prim(ureg, d3d_to_pipe_prim_type[dcl.dcl_gs_input_primitive.primitive]);
8194babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri				break;
8204babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri			case SM4_OPCODE_DCL_GS_OUTPUT_PRIMITIVE_TOPOLOGY:
8214babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri				ureg_property_gs_output_prim(ureg, d3d_to_pipe_prim[dcl.dcl_gs_output_primitive_topology.primitive_topology]);
8224babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri				break;
8234babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri			case SM4_OPCODE_DCL_MAX_OUTPUT_VERTEX_COUNT:
8244babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri				ureg_property_gs_max_vertices(ureg, dcl.num);
8254babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri				break;
82692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			default:
82792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				check(0);
82892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
82992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
83092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
83192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		translate_insns(0, program.insns.size());
832e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		sm4_to_tgsi_insn_num.push_back(ureg_get_instruction_number(ureg));
83392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(in_sub)
83492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			ureg_ENDSUB(ureg);
83592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		else
83692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			ureg_END(ureg);
83792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
838e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		for(unsigned i = 0; i < label_to_sm4_insn_num.size(); ++i)
839e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			ureg_fixup_label(ureg, label_to_sm4_insn_num[i].first, sm4_to_tgsi_insn_num[label_to_sm4_insn_num[i].second]);
84092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
84192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		const struct tgsi_token * tokens = ureg_get_tokens(ureg, 0);
84292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		ureg_destroy(ureg);
84392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return (void*)tokens;
84492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
84592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
84692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void* translate()
84792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
84892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		try
84992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
85092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return do_translate();
85192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
85292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		catch(const char*)
85392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
85492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return 0;
85592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
85692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
85792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
85892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
859e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbierivoid* sm4_to_tgsi(struct sm4_program& program)
86092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
861e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	sm4_to_tgsi_converter conv(program);
86292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	return conv.translate();
86392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
864