1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * on the rights to use, copy, modify, merge, publish, distribute, sub
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * license, and/or sell copies of the Software, and to permit persons to whom
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the Software is furnished to do so, subject to the following conditions:
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software.
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE OR OTHER DEALINGS IN THE SOFTWARE.
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r600_sq.h"
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r600_llvm.h"
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r600_formats.h"
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r600_opcodes.h"
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r600d.h"
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_shader_tokens.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_info.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_parse.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_scan.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_dump.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdio.h>
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <errno.h>
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <byteswap.h>
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* CAYMAN notes
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgWhy CAYMAN got loops for lots of instructions is explained here.
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org-These 8xx t-slot only ops are implemented in all vector slots.
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgMUL_LIT, FLT_TO_UINT, INT_TO_FLT, UINT_TO_FLT
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThese 8xx t-slot only opcodes become vector ops, with all four
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgslots expecting the arguments on sources a and b. Result is
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbroadcast to all channels.
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgMULLO_INT, MULHI_INT, MULLO_UINT, MULHI_UINT
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThese 8xx t-slot only opcodes become vector ops in the z, y, and
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx slots.
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgEXP_IEEE, LOG_IEEE/CLAMPED, RECIP_IEEE/CLAMPED/FF/INT/UINT/_64/CLAMPED_64
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgRECIPSQRT_IEEE/CLAMPED/FF/_64/CLAMPED_64
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSQRT_IEEE/_64
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSIN/COS
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThe w slot may have an independent co-issued operation, or if the
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgresult is required to be in the w slot, the opcode above may be
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgissued in the w slot as well.
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThe compiler must issue the source argument to slots z, y, and x
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader)
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_shader *rshader = &shader->shader;
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t *ptr;
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int	i;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* copy new shader */
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (shader->bo == NULL) {
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		shader->bo = (struct r600_resource*)
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			pipe_buffer_create(ctx->screen, PIPE_BIND_CUSTOM, PIPE_USAGE_IMMUTABLE, rshader->bc.ndw * 4);
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (shader->bo == NULL) {
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return -ENOMEM;
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ptr = (uint32_t*)rctx->ws->buffer_map(shader->bo->cs_buf, rctx->cs, PIPE_TRANSFER_WRITE);
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (R600_BIG_ENDIAN) {
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (i = 0; i < rshader->bc.ndw; ++i) {
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ptr[i] = bswap_32(rshader->bc.bytecode[i]);
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * sizeof(*ptr));
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rctx->ws->buffer_unmap(shader->bo->cs_buf);
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* build state */
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (rshader->processor_type) {
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case TGSI_PROCESSOR_VERTEX:
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rctx->chip_class >= EVERGREEN) {
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			evergreen_pipe_shader_vs(ctx, shader);
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_pipe_shader_vs(ctx, shader);
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case TGSI_PROCESSOR_FRAGMENT:
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rctx->chip_class >= EVERGREEN) {
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			evergreen_pipe_shader_ps(ctx, shader);
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_pipe_shader_ps(ctx, shader);
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return -EINVAL;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_shader *pipeshader);
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader)
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	static int dump_shaders = -1;
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_shader_selector *sel = shader->selector;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int r;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Would like some magic "get_bool_option_once" routine.
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	*/
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (dump_shaders == -1)
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		dump_shaders = debug_get_bool_option("R600_DUMP_SHADERS", FALSE);
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (dump_shaders) {
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		fprintf(stderr, "--------------------------------------------------------------\n");
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_dump(sel->tokens, 0);
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (sel->so.num_outputs) {
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			unsigned i;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			fprintf(stderr, "STREAMOUT\n");
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (i = 0; i < sel->so.num_outputs; i++) {
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				unsigned mask = ((1 << sel->so.output[i].num_components) - 1) <<
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						sel->so.output[i].start_component;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				fprintf(stderr, "  %i: MEM_STREAM0_BUF%i OUT[%i].%s%s%s%s\n", i,
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					sel->so.output[i].output_buffer, sel->so.output[i].register_index,
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				        mask & 1 ? "x" : "_",
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				        (mask >> 1) & 1 ? "y" : "_",
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				        (mask >> 2) & 1 ? "z" : "_",
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				        (mask >> 3) & 1 ? "w" : "_");
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = r600_shader_from_tgsi(rctx, shader);
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r) {
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("translation from TGSI failed !\n");
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = r600_bytecode_build(&shader->shader.bc);
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r) {
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("building bytecode failed !\n");
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (dump_shaders) {
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_dump(&shader->shader.bc);
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		fprintf(stderr, "______________________________________________________________\n");
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return r600_pipe_shader(ctx, shader);
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader)
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pipe_resource_reference((struct pipe_resource**)&shader->bo, NULL);
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_clear(&shader->shader.bc);
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * tgsi -> r600 shader
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct r600_shader_tgsi_instruction;
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct r600_shader_src {
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned				sel;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned				swizzle[4];
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned				neg;
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned				abs;
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned				rel;
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t				value[4];
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct r600_shader_ctx {
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_shader_info			info;
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_parse_context		parse;
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	const struct tgsi_token			*tokens;
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned				type;
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned				file_offset[TGSI_FILE_COUNT];
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned				temp_reg;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_shader_tgsi_instruction	*inst_info;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode			*bc;
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_shader			*shader;
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_shader_src			src[4];
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t				*literals;
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t				nliterals;
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t				max_driver_temp_used;
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* needed for evergreen interpolation */
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	boolean                                 input_centroid;
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	boolean                                 input_linear;
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	boolean                                 input_perspective;
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int					num_interp_gpr;
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int					face_gpr;
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int					colors_used;
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	boolean                 clip_vertex_write;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned                cv_output;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int					fragcoord_input;
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int					native_integers;
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct r600_shader_tgsi_instruction {
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned	tgsi_opcode;
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned	is_op3;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned	r600_opcode;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int (*process)(struct r600_shader_ctx *ctx);
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[], cm_shader_tgsi_instruction[];
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only);
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type);
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_else(struct r600_shader_ctx *ctx);
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_endif(struct r600_shader_ctx *ctx);
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_bgnloop(struct r600_shader_ctx *ctx);
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_endloop(struct r600_shader_ctx *ctx);
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx);
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * bytestream -> r600 shader
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * These functions are used to transform the output of the LLVM backend into
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * struct r600_bytecode.
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_bytecode_from_byte_stream(struct r600_shader_ctx *ctx,
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				unsigned char * bytes,	unsigned num_bytes);
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_OPENCL
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint r600_compute_shader_create(struct pipe_context * ctx,
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	LLVMModuleRef mod,  struct r600_bytecode * bytecode)
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *r600_ctx = (struct r600_context *)ctx;
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned char * bytes;
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned byte_count;
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_shader_ctx shader_ctx;
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned dump = 0;
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (debug_get_bool_option("R600_DUMP_SHADERS", FALSE)) {
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		dump = 1;
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_llvm_compile(mod, &bytes, &byte_count, r600_ctx->family , dump);
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	shader_ctx.bc = bytecode;
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_init(shader_ctx.bc, r600_ctx->chip_class, r600_ctx->family);
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	shader_ctx.bc->type = TGSI_PROCESSOR_COMPUTE;
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_from_byte_stream(&shader_ctx, bytes, byte_count);
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (shader_ctx.bc->chip_class == CAYMAN) {
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		cm_bytecode_add_cf_end(shader_ctx.bc);
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_build(shader_ctx.bc);
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (dump) {
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_dump(shader_ctx.bc);
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 1;
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* HAVE_OPENCL */
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t i32_from_byte_stream(unsigned char * bytes,
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned * bytes_read)
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned i;
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t out = 0;
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		out |= bytes[(*bytes_read)++] << (8 * i);
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return out;
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned r600_src_from_byte_stream(unsigned char * bytes,
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned bytes_read, struct r600_bytecode_alu * alu, unsigned src_idx)
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned i;
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned sel0, sel1;
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	sel0 = bytes[bytes_read++];
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	sel1 = bytes[bytes_read++];
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu->src[src_idx].sel = sel0 | (sel1 << 8);
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu->src[src_idx].chan = bytes[bytes_read++];
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu->src[src_idx].neg = bytes[bytes_read++];
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu->src[src_idx].abs = bytes[bytes_read++];
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu->src[src_idx].rel = bytes[bytes_read++];
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu->src[src_idx].kc_bank = bytes[bytes_read++];
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu->src[src_idx].value |= bytes[bytes_read++] << (i * 8);
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return bytes_read;
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned r600_alu_from_byte_stream(struct r600_shader_ctx *ctx,
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				unsigned char * bytes, unsigned bytes_read)
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned src_idx;
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned inst0, inst1;
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned push_modifier;
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&alu, 0, sizeof(alu));
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for(src_idx = 0; src_idx < 3; src_idx++) {
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bytes_read = r600_src_from_byte_stream(bytes, bytes_read,
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org								&alu, src_idx);
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.sel = bytes[bytes_read++];
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.chan = bytes[bytes_read++];
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.clamp = bytes[bytes_read++];
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.write = bytes[bytes_read++];
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.rel = bytes[bytes_read++];
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	inst0 = bytes[bytes_read++];
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	inst1 = bytes[bytes_read++];
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.inst = inst0 | (inst1 << 8);
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.last = bytes[bytes_read++];
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.is_op3 = bytes[bytes_read++];
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	push_modifier = bytes[bytes_read++];
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.pred_sel = bytes[bytes_read++];
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.bank_swizzle = bytes[bytes_read++];
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.bank_swizzle_force = bytes[bytes_read++];
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.omod = bytes[bytes_read++];
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.index_mode = bytes[bytes_read++];
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE) ||
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE) ||
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT) ||
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)) {
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.update_pred = 1;
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 0;
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = V_SQ_ALU_SRC_0;
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].chan = 0;
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (push_modifier) {
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        alu.pred_sel = 0;
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.execute_mask = 1;
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_add_alu(ctx->bc, &alu);
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* XXX: Handle other KILL instructions */
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT)) {
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->shader->uses_kill = 1;
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* XXX: This should be enforced in the LLVM backend. */
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->bc->force_add_cf = 1;
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return bytes_read;
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void llvm_if(struct r600_shader_ctx *ctx, struct r600_bytecode_alu * alu,
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned pred_inst)
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	fc_pushlevel(ctx, FC_IF);
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_break_from_byte_stream(struct r600_shader_ctx *ctx,
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			struct r600_bytecode_alu *alu, unsigned compare_opcode)
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned opcode = TGSI_OPCODE_BRK;
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx->bc->chip_class == CAYMAN)
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->inst_info = &cm_shader_tgsi_instruction[opcode];
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	else if (ctx->bc->chip_class >= EVERGREEN)
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->inst_info = &eg_shader_tgsi_instruction[opcode];
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	else
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->inst_info = &r600_shader_tgsi_instruction[opcode];
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	llvm_if(ctx, alu, compare_opcode);
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tgsi_loop_brk_cont(ctx);
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tgsi_endif(ctx);
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned r600_fc_from_byte_stream(struct r600_shader_ctx *ctx,
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				unsigned char * bytes, unsigned bytes_read)
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned inst;
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&alu, 0, sizeof(alu));
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	bytes_read = r600_src_from_byte_stream(bytes, bytes_read, &alu, 0);
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	inst = bytes[bytes_read++];
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (inst) {
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 0: /* FC_IF */
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		llvm_if(ctx, &alu,
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 1: /* FC_IF_INT */
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		llvm_if(ctx, &alu,
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 2: /* FC_ELSE */
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_else(ctx);
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 3: /* FC_ENDIF */
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_endif(ctx);
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 4: /* FC_BGNLOOP */
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_bgnloop(ctx);
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 5: /* FC_ENDLOOP */
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_endloop(ctx);
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 6: /* FC_BREAK */
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_break_from_byte_stream(ctx, &alu,
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT));
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 7: /* FC_BREAK_NZ_INT */
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_break_from_byte_stream(ctx, &alu,
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 8: /* FC_CONTINUE */
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			unsigned opcode = TGSI_OPCODE_CONT;
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (ctx->bc->chip_class == CAYMAN) {
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ctx->inst_info =
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					&cm_shader_tgsi_instruction[opcode];
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			} else if (ctx->bc->chip_class >= EVERGREEN) {
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ctx->inst_info =
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					&eg_shader_tgsi_instruction[opcode];
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			} else {
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ctx->inst_info =
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					&r600_shader_tgsi_instruction[opcode];
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tgsi_loop_brk_cont(ctx);
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 9: /* FC_BREAK_Z_INT */
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_break_from_byte_stream(ctx, &alu,
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT));
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 10: /* FC_BREAK_NZ */
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_break_from_byte_stream(ctx, &alu,
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return bytes_read;
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned r600_tex_from_byte_stream(struct r600_shader_ctx *ctx,
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				unsigned char * bytes, unsigned bytes_read)
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_tex tex;
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.inst = bytes[bytes_read++];
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.resource_id = bytes[bytes_read++];
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.src_gpr = bytes[bytes_read++];
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.src_rel = bytes[bytes_read++];
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.dst_gpr = bytes[bytes_read++];
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.dst_rel = bytes[bytes_read++];
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.dst_sel_x = bytes[bytes_read++];
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.dst_sel_y = bytes[bytes_read++];
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.dst_sel_z = bytes[bytes_read++];
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.dst_sel_w = bytes[bytes_read++];
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.lod_bias = bytes[bytes_read++];
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.coord_type_x = bytes[bytes_read++];
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.coord_type_y = bytes[bytes_read++];
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.coord_type_z = bytes[bytes_read++];
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.coord_type_w = bytes[bytes_read++];
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.offset_x = bytes[bytes_read++];
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.offset_y = bytes[bytes_read++];
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.offset_z = bytes[bytes_read++];
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.sampler_id = bytes[bytes_read++];
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.src_sel_x = bytes[bytes_read++];
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.src_sel_y = bytes[bytes_read++];
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.src_sel_z = bytes[bytes_read++];
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.src_sel_w = bytes[bytes_read++];
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_add_tex(ctx->bc, &tex);
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return bytes_read;
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int r600_vtx_from_byte_stream(struct r600_shader_ctx *ctx,
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned char * bytes, unsigned bytes_read)
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_vtx vtx;
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t word0 = i32_from_byte_stream(bytes, &bytes_read);
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        uint32_t word1 = i32_from_byte_stream(bytes, &bytes_read);
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t word2 = i32_from_byte_stream(bytes, &bytes_read);
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&vtx, 0, sizeof(vtx));
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* WORD0 */
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.inst = G_SQ_VTX_WORD0_VTX_INST(word0);
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.fetch_type = G_SQ_VTX_WORD0_FETCH_TYPE(word0);
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.buffer_id = G_SQ_VTX_WORD0_BUFFER_ID(word0);
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.src_gpr = G_SQ_VTX_WORD0_SRC_GPR(word0);
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.src_sel_x = G_SQ_VTX_WORD0_SRC_SEL_X(word0);
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.mega_fetch_count = G_SQ_VTX_WORD0_MEGA_FETCH_COUNT(word0);
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* WORD1 */
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.dst_gpr = G_SQ_VTX_WORD1_GPR_DST_GPR(word1);
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.dst_sel_x = G_SQ_VTX_WORD1_DST_SEL_X(word1);
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.dst_sel_y = G_SQ_VTX_WORD1_DST_SEL_Y(word1);
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.dst_sel_z = G_SQ_VTX_WORD1_DST_SEL_Z(word1);
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.dst_sel_w = G_SQ_VTX_WORD1_DST_SEL_W(word1);
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.use_const_fields = G_SQ_VTX_WORD1_USE_CONST_FIELDS(word1);
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.data_format = G_SQ_VTX_WORD1_DATA_FORMAT(word1);
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.num_format_all = G_SQ_VTX_WORD1_NUM_FORMAT_ALL(word1);
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.format_comp_all = G_SQ_VTX_WORD1_FORMAT_COMP_ALL(word1);
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.srf_mode_all = G_SQ_VTX_WORD1_SRF_MODE_ALL(word1);
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* WORD 2*/
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.offset = G_SQ_VTX_WORD2_OFFSET(word2);
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.endian = G_SQ_VTX_WORD2_ENDIAN_SWAP(word2);
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r600_bytecode_add_vtx(ctx->bc, &vtx)) {
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		fprintf(stderr, "Error adding vtx\n");
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Use the Texture Cache */
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->bc->cf_last->inst = EG_V_SQ_CF_WORD1_SQ_CF_INST_TEX;
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return bytes_read;
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_bytecode_from_byte_stream(struct r600_shader_ctx *ctx,
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				unsigned char * bytes,	unsigned num_bytes)
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned bytes_read = 0;
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned i, byte;
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	while (bytes_read < num_bytes) {
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		char inst_type = bytes[bytes_read++];
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (inst_type) {
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 0:
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			bytes_read = r600_alu_from_byte_stream(ctx, bytes,
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org								bytes_read);
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 1:
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			bytes_read = r600_tex_from_byte_stream(ctx, bytes,
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org								bytes_read);
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 2:
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			bytes_read = r600_fc_from_byte_stream(ctx, bytes,
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org								bytes_read);
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 3:
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_add_cfinst(ctx->bc, CF_NATIVE);
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (i = 0; i < 2; i++) {
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				for (byte = 0 ; byte < 4; byte++) {
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					ctx->bc->cf_last->isa[i] |=
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					(bytes[bytes_read++] << (byte * 8));
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				}
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 4:
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			bytes_read = r600_vtx_from_byte_stream(ctx, bytes,
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org								bytes_read);
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* XXX: Error here */
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* End bytestream -> r600 shader functions*/
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int j;
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (i->Instruction.NumDstRegs > 1) {
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return -EINVAL;
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (i->Instruction.Predicate) {
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("predicate unsupported\n");
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return -EINVAL;
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (i->Instruction.Label) {
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("label unsupported\n");
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return -EINVAL;
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i->Src[j].Register.Dimension) {
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			R600_ERR("unsupported src %d (dimension %d)\n", j,
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 i->Src[j].Register.Dimension);
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return -EINVAL;
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i->Dst[j].Register.Dimension) {
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			R600_ERR("unsupported dst (dimension)\n");
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return -EINVAL;
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r;
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int gpr = 0, base_chan = 0;
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int ij_index = 0;
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ij_index = 0;
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->shader->input[input].centroid)
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ij_index++;
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ij_index = 0;
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* if we have perspective add one */
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->input_perspective)  {
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ij_index++;
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* if we have perspective centroid */
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (ctx->input_centroid)
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ij_index++;
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->shader->input[input].centroid)
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ij_index++;
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* work out gpr and base_chan from index */
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	gpr = ij_index / 2;
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	base_chan = (2 * (ij_index % 2)) + 1;
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 8; i++) {
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i < 4)
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_ZW;
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_XY;
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((i > 1) && (i < 6)) {
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = ctx->shader->input[input].gpr;
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = i % 4;
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = gpr;
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = (base_chan - (i % 2));
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.bank_swizzle_force = SQ_ALU_VEC_210;
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((i % 4) == 3)
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input)
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r;
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_LOAD_P0;
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->shader->input[input].gpr;
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = i;
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = i;
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == 3)
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Special export handling in shaders
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * shader export ARRAY_BASE for EXPORT_POS:
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 60 is position
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 61 is misc vector
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 62, 63 are clip distance vectors
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The use of the values exported in 61-63 are controlled by PA_CL_VS_OUT_CNTL:
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * VS_OUT_MISC_VEC_ENA - enables the use of all fields in export 61
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE_VTX_POINT_SIZE - point size in the X channel of export 61
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE_VTX_EDGE_FLAG - edge flag in the Y channel of export 61
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE_VTX_RENDER_TARGET_INDX - render target index in the Z channel of export 61
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE_VTX_VIEWPORT_INDX - viewport index in the W channel of export 61
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE_VTX_KILL_FLAG - kill flag in the Z channel of export 61 (mutually
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * exclusive from render target index)
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * VS_OUT_CCDIST0_VEC_ENA/VS_OUT_CCDIST1_VEC_ENA - enable clip distance vectors
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * shader export ARRAY_BASE for EXPORT_PIXEL:
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 0-7 CB targets
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 61 computed Z vector
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The use of the values exported in the computed Z vector are controlled
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * by DB_SHADER_CONTROL:
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Z_EXPORT_ENABLE - Z as a float in RED
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * STENCIL_REF_EXPORT_ENABLE - stencil ref as int in GREEN
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * COVERAGE_TO_MASK_ENABLE - alpha to mask in ALPHA
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MASK_EXPORT_ENABLE - pixel sample mask in BLUE
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DB_SOURCE_FORMAT - export control restrictions
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Map name/sid pair from tgsi to the 8-bit semantic index for SPI setup */
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int r600_spi_sid(struct r600_shader_io * io)
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int index, name = io->name;
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* These params are handled differently, they don't need
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * semantic indices, so we'll use 0 for them.
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 */
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (name == TGSI_SEMANTIC_POSITION ||
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		name == TGSI_SEMANTIC_PSIZE ||
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		name == TGSI_SEMANTIC_FACE)
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		index = 0;
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	else {
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (name == TGSI_SEMANTIC_GENERIC) {
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* For generic params simply use sid from tgsi */
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			index = io->sid;
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* For non-generic params - pack name and sid into 8 bits */
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			index = 0x80 | (name<<3) | (io->sid);
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* Make sure that all really used indices have nonzero value, so
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * we can just compare it to 0 later instead of comparing the name
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * with different values to detect special cases. */
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		index++;
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return index;
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* turn input into interpolate on EG */
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int evergreen_interp_input(struct r600_shader_ctx *ctx, int index)
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int r = 0;
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx->shader->input[index].spi_sid) {
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->shader->input[index].lds_pos = ctx->shader->nlds++;
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->shader->input[index].interpolate > 0) {
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = evergreen_interp_alu(ctx, index);
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = evergreen_interp_flat(ctx, index);
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return r;
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int select_twoside_color(struct r600_shader_ctx *ctx, int front, int back)
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r;
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int gpr_front = ctx->shader->input[front].gpr;
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int gpr_back = ctx->shader->input[back].gpr;
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(alu));
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.is_op3 = 1;
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = gpr_front;
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = ctx->face_gpr;
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = gpr_front;
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].sel = gpr_back;
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = i;
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].chan = i;
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].chan = i;
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = (i==3);
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_declaration(struct r600_shader_ctx *ctx)
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned i;
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int r;
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (d->Declaration.File) {
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case TGSI_FILE_INPUT:
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		i = ctx->shader->ninput++;
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->shader->input[i].name = d->Semantic.Name;
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->shader->input[i].sid = d->Semantic.Index;
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]);
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->shader->input[i].interpolate = d->Interp.Interpolate;
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->shader->input[i].centroid = d->Interp.Centroid;
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First;
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->type == TGSI_PROCESSOR_FRAGMENT) {
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			switch (ctx->shader->input[i].name) {
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case TGSI_SEMANTIC_FACE:
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ctx->face_gpr = ctx->shader->input[i].gpr;
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case TGSI_SEMANTIC_COLOR:
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ctx->colors_used++;
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case TGSI_SEMANTIC_POSITION:
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ctx->fragcoord_input = i;
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (ctx->bc->chip_class >= EVERGREEN) {
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if ((r = evergreen_interp_input(ctx, i)))
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case TGSI_FILE_OUTPUT:
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		i = ctx->shader->noutput++;
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->shader->output[i].name = d->Semantic.Name;
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->shader->output[i].sid = d->Semantic.Index;
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]);
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First;
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->shader->output[i].interpolate = d->Interp.Interpolate;
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->shader->output[i].write_mask = d->Declaration.UsageMask;
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			switch (d->Semantic.Name) {
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case TGSI_SEMANTIC_CLIPDIST:
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ctx->shader->clip_dist_write |= d->Declaration.UsageMask << (d->Semantic.Index << 2);
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case TGSI_SEMANTIC_PSIZE:
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ctx->shader->vs_out_misc_write = 1;
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ctx->shader->vs_out_point_size = 1;
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case TGSI_SEMANTIC_CLIPVERTEX:
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ctx->clip_vertex_write = TRUE;
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ctx->cv_output = i;
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else if (ctx->type == TGSI_PROCESSOR_FRAGMENT) {
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			switch (d->Semantic.Name) {
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case TGSI_SEMANTIC_COLOR:
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ctx->shader->nr_ps_max_color_exports++;
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case TGSI_FILE_CONSTANT:
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case TGSI_FILE_TEMPORARY:
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case TGSI_FILE_SAMPLER:
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case TGSI_FILE_ADDRESS:
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case TGSI_FILE_SYSTEM_VALUE:
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) {
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (!ctx->native_integers) {
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				struct r600_bytecode_alu alu;
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT);
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = 0;
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = 3;
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = 0;
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = 3;
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.write = 1;
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.last = 1;
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else if (d->Semantic.Name == TGSI_SEMANTIC_VERTEXID)
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return -EINVAL;
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int r600_get_temp(struct r600_shader_ctx *ctx)
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return ctx->temp_reg + ctx->max_driver_temp_used++;
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for evergreen we need to scan the shader to find the number of GPRs we need to
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * reserve for interpolation.
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we need to know if we are going to emit
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * any centroid inputs
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * if perspective and linear are required
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int evergreen_gpr_count(struct r600_shader_ctx *ctx)
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i;
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int num_baryc;
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->input_linear = FALSE;
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->input_perspective = FALSE;
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->input_centroid = FALSE;
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->num_interp_gpr = 1;
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* any centroid inputs */
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < ctx->info.num_inputs; i++) {
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* skip position/face */
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx->input_linear = TRUE;
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx->input_perspective = TRUE;
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->info.input_centroid[i])
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx->input_centroid = TRUE;
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	num_baryc = 0;
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* ignoring sample for now */
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx->input_perspective)
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_baryc++;
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx->input_linear)
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_baryc++;
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx->input_centroid)
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_baryc *= 2;
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->num_interp_gpr += (num_baryc + 1) >> 1;
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* XXX PULL MODEL and LINE STIPPLE, FIXED PT POS */
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return ctx->num_interp_gpr;
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void tgsi_src(struct r600_shader_ctx *ctx,
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     const struct tgsi_full_src_register *tgsi_src,
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     struct r600_shader_src *r600_src)
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(r600_src, 0, sizeof(*r600_src));
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_src->swizzle[0] = tgsi_src->Register.SwizzleX;
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_src->swizzle[1] = tgsi_src->Register.SwizzleY;
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ;
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_src->swizzle[3] = tgsi_src->Register.SwizzleW;
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_src->neg = tgsi_src->Register.Negate;
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_src->abs = tgsi_src->Register.Absolute;
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		int index;
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) &&
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) &&
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) {
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX;
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg);
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r600_src->sel != V_SQ_ALU_SRC_LITERAL)
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return;
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		index = tgsi_src->Register.Index;
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_src->sel = V_SQ_ALU_SRC_LITERAL;
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value));
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) {
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) {
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_src->swizzle[0] = 3;
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_src->swizzle[1] = 3;
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_src->swizzle[2] = 3;
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_src->swizzle[3] = 3;
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_src->sel = 0;
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_VERTEXID) {
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_src->swizzle[0] = 0;
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_src->swizzle[1] = 0;
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_src->swizzle[2] = 0;
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_src->swizzle[3] = 0;
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_src->sel = 0;
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (tgsi_src->Register.Indirect)
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_src->rel = V_SQ_REL_RELATIVE;
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_src->sel = tgsi_src->Register.Index;
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg)
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_vtx vtx;
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int ar_reg;
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int r;
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (offset) {
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct r600_bytecode_alu alu;
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(alu));
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = ctx->bc->ar_reg;
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].value = offset;
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = dst_reg;
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ar_reg = dst_reg;
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ar_reg = ctx->bc->ar_reg;
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&vtx, 0, sizeof(vtx));
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.fetch_type = 2;		/* VTX_FETCH_NO_INDEX_OFFSET */
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.src_gpr = ar_reg;
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.mega_fetch_count = 16;
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.dst_gpr = dst_reg;
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.dst_sel_x = 0;		/* SEL_X */
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.dst_sel_y = 1;		/* SEL_Y */
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.dst_sel_z = 2;		/* SEL_Z */
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.dst_sel_w = 3;		/* SEL_W */
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.data_format = FMT_32_32_32_32_FLOAT;
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.num_format_all = 2;		/* NUM_FORMAT_SCALED */
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.format_comp_all = 1;	/* FORMAT_COMP_SIGNED */
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.srf_mode_all = 1;		/* SRF_MODE_NO_ZERO */
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vtx.endian = r600_endian_swap(32);
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx)))
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_split_constant(struct r600_shader_ctx *ctx)
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, j, k, nconst, r;
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			nconst++;
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_src(ctx, &inst->Src[i], &ctx->src[i]);
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) {
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->src[i].rel) {
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			int treg = r600_get_temp(ctx);
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg)))
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx->src[i].sel = treg;
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx->src[i].rel = 0;
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			j--;
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else if (j > 0) {
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			int treg = r600_get_temp(ctx);
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (k = 0; k < 4; k++) {
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = ctx->src[i].sel;
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = k;
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].rel = ctx->src[i].rel;
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = treg;
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = k;
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.write = 1;
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (k == 3)
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.last = 1;
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r = r600_bytecode_add_alu(ctx->bc, &alu);
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (r)
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx->src[i].sel = treg;
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx->src[i].rel =0;
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			j--;
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx)
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, j, k, nliteral, r;
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			nliteral++;
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			int treg = r600_get_temp(ctx);
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (k = 0; k < 4; k++) {
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = ctx->src[i].sel;
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = k;
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].value = ctx->src[i].value[k];
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = treg;
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = k;
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.write = 1;
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (k == 3)
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.last = 1;
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r = r600_bytecode_add_alu(ctx->bc, &alu);
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (r)
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx->src[i].sel = treg;
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			j--;
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int process_twoside_color_inputs(struct r600_shader_ctx *ctx)
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r, count = ctx->shader->ninput;
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* additional inputs will be allocated right after the existing inputs,
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * we won't need them after the color selection, so we don't need to
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * reserve these gprs for the rest of the shader code and to adjust
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * output offsets etc. */
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int gpr = ctx->file_offset[TGSI_FILE_INPUT] +
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx->info.file_max[TGSI_FILE_INPUT] + 1;
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx->face_gpr == -1) {
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		i = ctx->shader->ninput++;
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->shader->input[i].name = TGSI_SEMANTIC_FACE;
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->shader->input[i].spi_sid = 0;
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->shader->input[i].gpr = gpr++;
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->face_gpr = ctx->shader->input[i].gpr;
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < count; i++) {
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) {
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			int ni = ctx->shader->ninput++;
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memcpy(&ctx->shader->input[ni],&ctx->shader->input[i], sizeof(struct r600_shader_io));
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx->shader->input[ni].name = TGSI_SEMANTIC_BCOLOR;
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx->shader->input[ni].spi_sid = r600_spi_sid(&ctx->shader->input[ni]);
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx->shader->input[ni].gpr = gpr++;
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (ctx->bc->chip_class >= EVERGREEN) {
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r = evergreen_interp_input(ctx, ni);
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (r)
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = select_twoside_color(ctx, i, ni);
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_shader *pipeshader)
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_shader *shader = &pipeshader->shader;
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_token *tokens = pipeshader->selector->tokens;
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct pipe_stream_output_info so = pipeshader->selector->so;
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_immediate *immediate;
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_property *property;
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_shader_ctx ctx;
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_output output[32];
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned output_done, noutput;
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned opcode;
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, j, k, r = 0;
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int next_pixel_base = 0, next_pos_base = 60, next_param_base = 0;
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Declarations used by llvm code */
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	bool use_llvm = false;
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned char * inst_bytes = NULL;
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned inst_byte_count = 0;
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef R600_USE_LLVM
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	use_llvm = debug_get_bool_option("R600_LLVM", TRUE);
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx.bc = &shader->bc;
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx.shader = shader;
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx.native_integers = true;
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_init(ctx.bc, rctx->chip_class, rctx->family);
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx.tokens = tokens;
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tgsi_scan_shader(tokens, &ctx.info);
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tgsi_parse_init(&ctx.parse, tokens);
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx.type = ctx.parse.FullHeader.Processor.Processor;
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	shader->processor_type = ctx.type;
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx.bc->type = shader->processor_type;
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx.face_gpr = -1;
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx.fragcoord_input = -1;
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx.colors_used = 0;
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx.clip_vertex_write = 0;
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	shader->nr_ps_color_exports = 0;
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	shader->nr_ps_max_color_exports = 0;
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	shader->two_side = (ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->two_side;
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* register allocations */
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Values [0,127] correspond to GPR[0..127].
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * Values [128,159] correspond to constant buffer bank 0
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * Values [160,191] correspond to constant buffer bank 1
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG)
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * Values [256,287] correspond to constant buffer bank 2 (EG)
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * Values [288,319] correspond to constant buffer bank 3 (EG)
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * Other special values are shown in the list below.
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 248	SQ_ALU_SRC_0: special constant 0.0.
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 254	SQ_ALU_SRC_PV: previous vector result.
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 255	SQ_ALU_SRC_PS: previous scalar result.
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 */
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < TGSI_FILE_COUNT; i++) {
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx.file_offset[i] = 0;
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx.file_offset[TGSI_FILE_INPUT] = 1;
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx.bc->chip_class >= EVERGREEN) {
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) {
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* LLVM backend setup */
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef R600_USE_LLVM
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (use_llvm && ctx.info.indirect_files) {
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		fprintf(stderr, "Warning: R600 LLVM backend does not support "
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				"indirect adressing.  Falling back to TGSI "
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				"backend.\n");
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		use_llvm = 0;
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (use_llvm) {
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct radeon_llvm_context radeon_llvm_ctx;
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		LLVMModuleRef mod;
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned dump = 0;
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&radeon_llvm_ctx, 0, sizeof(radeon_llvm_ctx));
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_llvm_ctx.reserved_reg_count = ctx.file_offset[TGSI_FILE_INPUT];
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		mod = r600_tgsi_llvm(&radeon_llvm_ctx, tokens);
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (debug_get_bool_option("R600_DUMP_SHADERS", FALSE)) {
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			dump = 1;
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r600_llvm_compile(mod, &inst_bytes, &inst_byte_count,
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							rctx->family, dump)) {
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			FREE(inst_bytes);
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			radeon_llvm_dispose(&radeon_llvm_ctx);
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			use_llvm = 0;
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			fprintf(stderr, "R600 LLVM backend failed to compile "
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				"shader.  Falling back to TGSI\n");
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx.file_offset[TGSI_FILE_OUTPUT] =
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					ctx.file_offset[TGSI_FILE_INPUT];
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_llvm_dispose(&radeon_llvm_ctx);
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* End of LLVM backend setup */
1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!use_llvm) {
1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx.file_offset[TGSI_FILE_OUTPUT] =
1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx.file_offset[TGSI_FILE_INPUT] +
1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx.info.file_max[TGSI_FILE_INPUT] + 1;
1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						ctx.info.file_max[TGSI_FILE_OUTPUT] + 1;
1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Outside the GPR range. This will be translated to one of the
1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * kcache banks later. */
1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx.file_offset[TGSI_FILE_CONSTANT] = 512;
1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL;
1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx.bc->ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1;
1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx.temp_reg = ctx.bc->ar_reg + 1;
1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx.nliterals = 0;
1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx.literals = NULL;
1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	shader->fs_write_all = FALSE;
1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_parse_token(&ctx.parse);
1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (ctx.parse.FullToken.Token.Type) {
1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case TGSI_TOKEN_TYPE_IMMEDIATE:
1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			immediate = &ctx.parse.FullToken.FullImmediate;
1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(ctx.literals == NULL) {
1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r = -ENOMEM;
1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				goto out_err;
1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx.nliterals++;
1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case TGSI_TOKEN_TYPE_DECLARATION:
1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = tgsi_declaration(&ctx);
1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				goto out_err;
1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case TGSI_TOKEN_TYPE_INSTRUCTION:
1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case TGSI_TOKEN_TYPE_PROPERTY:
1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			property = &ctx.parse.FullToken.FullProperty;
1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			switch (property->Property.PropertyName) {
1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS:
1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (property->u[0].Data == 1)
1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					shader->fs_write_all = TRUE;
1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case TGSI_PROPERTY_VS_PROHIBIT_UCPS:
1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (property->u[0].Data == 1)
1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					shader->vs_prohibit_ucps = TRUE;
1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = -EINVAL;
1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			goto out_err;
1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (shader->fs_write_all && rctx->chip_class >= EVERGREEN)
1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		shader->nr_ps_max_color_exports = 8;
1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx.fragcoord_input >= 0) {
1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx.bc->chip_class == CAYMAN) {
1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (j = 0 ; j < 4; j++) {
1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				struct r600_bytecode_alu alu;
1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr;
1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = 3;
1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = shader->input[ctx.fragcoord_input].gpr;
1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = j;
1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.write = (j == 3);
1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.last = 1;
1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if ((r = r600_bytecode_add_alu(ctx.bc, &alu)))
1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			struct r600_bytecode_alu alu;
1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr;
1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 3;
1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = shader->input[ctx.fragcoord_input].gpr;
1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 3;
1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if ((r = r600_bytecode_add_alu(ctx.bc, &alu)))
1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (shader->two_side && ctx.colors_used) {
1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((r = process_twoside_color_inputs(&ctx)))
1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tgsi_parse_init(&ctx.parse, tokens);
1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_parse_token(&ctx.parse);
1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (ctx.parse.FullToken.Token.Type) {
1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case TGSI_TOKEN_TYPE_INSTRUCTION:
1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (use_llvm) {
1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				continue;
1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = tgsi_is_supported(&ctx);
1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				goto out_err;
1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx.max_driver_temp_used = 0;
1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* reserve first tmp for everyone */
1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_get_temp(&ctx);
1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if ((r = tgsi_split_constant(&ctx)))
1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				goto out_err;
1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if ((r = tgsi_split_literal_constant(&ctx)))
1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				goto out_err;
1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (ctx.bc->chip_class == CAYMAN)
1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ctx.inst_info = &cm_shader_tgsi_instruction[opcode];
1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			else if (ctx.bc->chip_class >= EVERGREEN)
1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			else
1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = ctx.inst_info->process(&ctx);
1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				goto out_err;
1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Get instructions if we are using the LLVM backend. */
1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (use_llvm) {
1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_from_byte_stream(&ctx, inst_bytes, inst_byte_count);
1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		FREE(inst_bytes);
1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	noutput = shader->noutput;
1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx.clip_vertex_write) {
1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* need to convert a clipvertex write into clipdistance writes and not export
1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   the clip vertex anymore */
1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&shader->output[noutput], 0, 2*sizeof(struct r600_shader_io));
1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST;
1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		shader->output[noutput].gpr = ctx.temp_reg;
1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		noutput++;
1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST;
1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		shader->output[noutput].gpr = ctx.temp_reg+1;
1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		noutput++;
1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* reset spi_sid for clipvertex output to avoid confusing spi */
1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		shader->output[ctx.cv_output].spi_sid = 0;
1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		shader->clip_dist_write = 0xFF;
1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (i = 0; i < 8; i++) {
1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			int oreg = i >> 2;
1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			int ochan = i & 3;
1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (j = 0; j < 4; j++) {
1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				struct r600_bytecode_alu alu;
1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4);
1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = shader->output[ctx.cv_output].gpr;
1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = j;
1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].sel = 512 + i;
1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].kc_bank = 1;
1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].chan = j;
1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = ctx.temp_reg + oreg;
1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = j;
1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.write = (j == ochan);
1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (j == 3)
1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.last = 1;
1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r = r600_bytecode_add_alu(ctx.bc, &alu);
1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (r)
1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Add stream outputs. */
1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx.type == TGSI_PROCESSOR_VERTEX && so.num_outputs) {
1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (i = 0; i < so.num_outputs; i++) {
1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			struct r600_bytecode_output output;
1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (so.output[i].output_buffer >= 4) {
1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				R600_ERR("exceeded the max number of stream output buffers, got: %d\n",
1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 so.output[i].output_buffer);
1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r = -EINVAL;
1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				goto out_err;
1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (so.output[i].dst_offset < so.output[i].start_component) {
1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   R600_ERR("stream_output - dst_offset cannot be less than start_component\n");
1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   r = -EINVAL;
1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   goto out_err;
1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&output, 0, sizeof(struct r600_bytecode_output));
1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output.gpr = shader->output[so.output[i].register_index].gpr;
1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output.elem_size = 0;
1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output.array_base = so.output[i].dst_offset - so.output[i].start_component;
1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_WRITE;
1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output.burst_count = 1;
1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output.barrier = 1;
1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* array_size is an upper limit for the burst_count
1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 * with MEM_STREAM instructions */
1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output.array_size = 0xFFF;
1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output.comp_mask = ((1 << so.output[i].num_components) - 1) << so.output[i].start_component;
1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (ctx.bc->chip_class >= EVERGREEN) {
1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				switch (so.output[i].output_buffer) {
1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				case 0:
1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF0;
1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					break;
1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				case 1:
1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF1;
1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					break;
1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				case 2:
1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF2;
1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					break;
1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				case 3:
1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF3;
1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					break;
1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				}
1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			} else {
1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				switch (so.output[i].output_buffer) {
1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				case 0:
1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0;
1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					break;
1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				case 1:
1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1;
1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					break;
1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				case 2:
1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2;
1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					break;
1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				case 3:
1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3;
1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					break;
1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				}
1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_output(ctx.bc, &output);
1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				goto out_err;
1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* export output */
1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0, j = 0; i < noutput; i++, j++) {
1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&output[j], 0, sizeof(struct r600_bytecode_output));
1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].gpr = shader->output[i].gpr;
1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].elem_size = 3;
1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].swizzle_x = 0;
1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].swizzle_y = 1;
1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].swizzle_z = 2;
1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].swizzle_w = 3;
1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].burst_count = 1;
1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].barrier = 1;
1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].type = -1;
1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (ctx.type) {
1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case TGSI_PROCESSOR_VERTEX:
1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			switch (shader->output[i].name) {
1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case TGSI_SEMANTIC_POSITION:
1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].array_base = next_pos_base++;
1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case TGSI_SEMANTIC_PSIZE:
1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].array_base = next_pos_base++;
1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case TGSI_SEMANTIC_CLIPVERTEX:
1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				j--;
1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case TGSI_SEMANTIC_CLIPDIST:
1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].array_base = next_pos_base++;
1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				/* spi_sid is 0 for clipdistance outputs that were generated
1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 * for clipvertex - we don't need to pass them to PS */
1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (shader->output[i].spi_sid) {
1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					j++;
1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					/* duplicate it as PARAM to pass to the pixel shader */
1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					memcpy(&output[j], &output[j-1], sizeof(struct r600_bytecode_output));
1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					output[j].array_base = next_param_base++;
1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				}
1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case TGSI_SEMANTIC_FOG:
1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].swizzle_y = 4; /* 0 */
1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].swizzle_z = 4; /* 0 */
1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].swizzle_w = 5; /* 1 */
1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case TGSI_PROCESSOR_FRAGMENT:
1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				/* never export more colors than the number of CBs */
1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (next_pixel_base && next_pixel_base >= (rctx->nr_cbufs + rctx->dual_src_blend * 1)) {
1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					/* skip export */
1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					j--;
1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					continue;
1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				}
1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].swizzle_w = rctx->alpha_to_one && rctx->multisample_enable && !rctx->cb0_is_integer ? 5 : 3;
1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].array_base = next_pixel_base++;
1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				shader->nr_ps_color_exports++;
1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) {
1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					for (k = 1; k < rctx->nr_cbufs; k++) {
1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						j++;
1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						memset(&output[j], 0, sizeof(struct r600_bytecode_output));
1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						output[j].gpr = shader->output[i].gpr;
1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						output[j].elem_size = 3;
1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						output[j].swizzle_x = 0;
1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						output[j].swizzle_y = 1;
1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						output[j].swizzle_z = 2;
1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						output[j].swizzle_w = rctx->alpha_to_one && rctx->multisample_enable && !rctx->cb0_is_integer ? 5 : 3;
1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						output[j].burst_count = 1;
1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						output[j].barrier = 1;
1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						output[j].array_base = next_pixel_base++;
1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						shader->nr_ps_color_exports++;
1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					}
1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				}
1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].array_base = 61;
1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].swizzle_x = 2;
1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].swizzle_y = 7;
1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].swizzle_z = output[j].swizzle_w = 7;
1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].array_base = 61;
1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].swizzle_x = 7;
1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].swizzle_y = 1;
1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].swizzle_z = output[j].swizzle_w = 7;
1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			} else {
1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r = -EINVAL;
1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				goto out_err;
1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			R600_ERR("unsupported processor type %d\n", ctx.type);
1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = -EINVAL;
1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			goto out_err;
1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (output[j].type==-1) {
1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output[j].array_base = next_param_base++;
1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* add fake param output for vertex shader if no param is exported */
1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx.type == TGSI_PROCESSOR_VERTEX && next_param_base == 0) {
1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&output[j], 0, sizeof(struct r600_bytecode_output));
1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output[j].gpr = 0;
1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output[j].elem_size = 3;
1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output[j].swizzle_x = 7;
1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output[j].swizzle_y = 7;
1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output[j].swizzle_z = 7;
1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output[j].swizzle_w = 7;
1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output[j].burst_count = 1;
1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output[j].barrier = 1;
1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output[j].array_base = 0;
1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			j++;
1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* add fake pixel export */
1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && next_pixel_base == 0) {
1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&output[j], 0, sizeof(struct r600_bytecode_output));
1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].gpr = 0;
1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].elem_size = 3;
1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].swizzle_x = 7;
1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].swizzle_y = 7;
1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].swizzle_z = 7;
1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].swizzle_w = 7;
1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].burst_count = 1;
1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].barrier = 1;
1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].array_base = 0;
1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		j++;
1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	noutput = j;
1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* set export done on last export of each type */
1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx.bc->chip_class < CAYMAN) {
1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (i == (noutput - 1)) {
1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				output[i].end_of_program = 1;
1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!(output_done & (1 << output[i].type))) {
1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output_done |= (1 << output[i].type);
1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* add output to bytecode */
1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < noutput; i++) {
1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_output(ctx.bc, &output[i]);
1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			goto out_err;
1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* add program end */
1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx.bc->chip_class == CAYMAN)
1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		cm_bytecode_add_cf_end(ctx.bc);
1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* check GPR limit - we have 124 = 128 - 4
1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * (4 are reserved as alu clause temporary registers) */
1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx.bc->ngpr > 124) {
1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("GPR limit exceeded - shader requires %d registers\n", ctx.bc->ngpr);
1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = -ENOMEM;
1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		goto out_err;
1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	free(ctx.literals);
1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tgsi_parse_free(&ctx.parse);
1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgout_err:
1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	free(ctx.literals);
1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tgsi_parse_free(&ctx.parse);
1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return r;
1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	R600_ERR("%s tgsi opcode unsupported\n",
1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode));
1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return -EINVAL;
1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_end(struct r600_shader_ctx *ctx)
1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src,
1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			const struct r600_shader_src *shader_src,
1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			unsigned chan)
1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	bc_src->sel = shader_src->sel;
1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	bc_src->chan = shader_src->swizzle[chan];
1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	bc_src->neg = shader_src->neg;
1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	bc_src->abs = shader_src->abs;
1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	bc_src->rel = shader_src->rel;
1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	bc_src->value = shader_src->value[bc_src->chan];
1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src)
1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	bc_src->abs = 1;
1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	bc_src->neg = 0;
1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src)
1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	bc_src->neg = !bc_src->neg;
1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void tgsi_dst(struct r600_shader_ctx *ctx,
1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     const struct tgsi_full_dst_register *tgsi_dst,
1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     unsigned swizzle,
1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     struct r600_bytecode_alu_dst *r600_dst)
1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_dst->sel = tgsi_dst->Register.Index;
1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_dst->chan = swizzle;
1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_dst->write = 1;
1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (tgsi_dst->Register.Indirect)
1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_dst->rel = V_SQ_REL_RELATIVE;
1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (inst->Instruction.Saturate) {
1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_dst->clamp = 1;
1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_last_instruction(unsigned writemask)
1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, lasti = 0;
1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (writemask & (1 << i)) {
1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			lasti = i;
1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return lasti;
1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only)
1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, j, r;
1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < lasti + 1; i++) {
1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = ctx->inst_info->r600_opcode;
1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!swap) {
1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* handle some special cases */
1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (ctx->inst_info->tgsi_opcode) {
1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case TGSI_OPCODE_SUB:
1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src_toggle_neg(&alu.src[1]);
1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case TGSI_OPCODE_ABS:
1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src_set_abs(&alu.src[0]);
1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == lasti || trans_only) {
1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_op2(struct r600_shader_ctx *ctx)
1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return tgsi_op2_s(ctx, 0, 0);
1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return tgsi_op2_s(ctx, 1, 0);
1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_op2_trans(struct r600_shader_ctx *ctx)
1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return tgsi_op2_s(ctx, 0, 1);
1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_ineg(struct r600_shader_ctx *ctx)
1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r;
1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < lasti + 1; i++) {
1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = ctx->inst_info->r600_opcode;
1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = V_SQ_ALU_SRC_0;
1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == lasti) {
1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx)
1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, j, r;
1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0 ; i < last_slot; i++) {
1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = ctx->inst_info->r600_opcode;
1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[j], &ctx->src[j], 0);
1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* RSQ should take the absolute value of src */
1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_RSQ) {
1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src_set_abs(&alu.src[j]);
1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
1889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == last_slot - 1)
1891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
1892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
1893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
1894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
1895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
1897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int cayman_mul_int_instr(struct r600_shader_ctx *ctx)
1900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, j, k, r;
1903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
1904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
1905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (k = 0; k < last_slot; k++) {
1906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!(inst->Dst[0].Register.WriteMask & (1 << k)))
1907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
1908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (i = 0 ; i < 4; i++) {
1910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = ctx->inst_info->r600_opcode;
1912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
1913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src(&alu.src[j], &ctx->src[j], k);
1914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = (i == k);
1917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (i == 3)
1918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.last = 1;
1919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
1920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
1921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
1922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
1925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
1928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * r600 - trunc to -PI..PI range
1929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * r700 - normalize by dividing by 2PI
1930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * see fdo bug 27901
1931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx)
1933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	static float half_inv_pi = 1.0 /(3.1415926535 * 2);
1935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	static float double_pi = 3.1415926535 * 2;
1936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	static float neg_pi = -3.1415926535;
1937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int r;
1939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
1940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.is_op3 = 1;
1944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.chan = 0;
1946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.sel = ctx->temp_reg;
1947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.write = 1;
1948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
1950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
1952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[1].chan = 0;
1953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[1].value = *(uint32_t *)&half_inv_pi;
1954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[2].sel = V_SQ_ALU_SRC_0_5;
1955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[2].chan = 0;
1956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.last = 1;
1957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = r600_bytecode_add_alu(ctx->bc, &alu);
1958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r)
1959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
1960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
1963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.chan = 0;
1965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.sel = ctx->temp_reg;
1966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.write = 1;
1967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[0].sel = ctx->temp_reg;
1969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[0].chan = 0;
1970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.last = 1;
1971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = r600_bytecode_add_alu(ctx->bc, &alu);
1972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r)
1973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
1974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.is_op3 = 1;
1978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.chan = 0;
1980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.sel = ctx->temp_reg;
1981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.write = 1;
1982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[0].sel = ctx->temp_reg;
1984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[0].chan = 0;
1985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
1987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[1].chan = 0;
1988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[2].chan = 0;
1990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx->bc->chip_class == R600) {
1992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].value = *(uint32_t *)&double_pi;
1993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].value = *(uint32_t *)&neg_pi;
1994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
1995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = V_SQ_ALU_SRC_1;
1996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].sel = V_SQ_ALU_SRC_0_5;
1997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].neg = 1;
1998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.last = 1;
2001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = r600_bytecode_add_alu(ctx->bc, &alu);
2002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r)
2003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
2004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
2005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int cayman_trig(struct r600_shader_ctx *ctx)
2008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
2011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
2012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r;
2013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = tgsi_setup_trig(ctx);
2015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r)
2016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
2017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < last_slot; i++) {
2020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = ctx->inst_info->r600_opcode;
2022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = i;
2023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
2026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = ctx->temp_reg;
2028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = 0;
2029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == last_slot - 1)
2030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
2032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
2033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
2034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
2036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_trig(struct r600_shader_ctx *ctx)
2039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
2042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r;
2043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
2044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = tgsi_setup_trig(ctx);
2046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r)
2047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
2048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.inst = ctx->inst_info->r600_opcode;
2051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.chan = 0;
2052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.sel = ctx->temp_reg;
2053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.write = 1;
2054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[0].sel = ctx->temp_reg;
2056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[0].chan = 0;
2057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.last = 1;
2058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = r600_bytecode_add_alu(ctx->bc, &alu);
2059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r)
2060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
2061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* replicate result */
2063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < lasti + 1; i++) {
2064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
2066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = ctx->temp_reg;
2071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == lasti)
2073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
2075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
2076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
2077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
2079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_scs(struct r600_shader_ctx *ctx)
2082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
2085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r;
2086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* We'll only need the trig stuff if we are going to write to the
2088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * X or Y components of the destination vector.
2089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 */
2090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
2091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = tgsi_setup_trig(ctx);
2092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
2093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
2094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* dst.x = COS */
2097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
2098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->bc->chip_class == CAYMAN) {
2099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (i = 0 ; i < 3; i++) {
2100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
2102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (i == 0)
2105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.dst.write = 1;
2106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				else
2107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.dst.write = 0;
2108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = ctx->temp_reg;
2109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = 0;
2110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (i == 2)
2111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.last = 1;
2112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r = r600_bytecode_add_alu(ctx->bc, &alu);
2113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (r)
2114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
2115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
2116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
2117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
2119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
2120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = ctx->temp_reg;
2122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 0;
2123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
2125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
2126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
2127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
2128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* dst.y = SIN */
2131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
2132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->bc->chip_class == CAYMAN) {
2133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (i = 0 ; i < 3; i++) {
2134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
2136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (i == 1)
2138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.dst.write = 1;
2139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				else
2140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.dst.write = 0;
2141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = ctx->temp_reg;
2142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = 0;
2143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (i == 2)
2144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.last = 1;
2145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r = r600_bytecode_add_alu(ctx->bc, &alu);
2146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (r)
2147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
2148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
2149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
2150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
2152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
2153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = ctx->temp_reg;
2155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 0;
2156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
2158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
2159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
2160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
2161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* dst.z = 0.0; */
2164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
2165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
2170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = V_SQ_ALU_SRC_0;
2172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = 0;
2173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
2175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
2177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
2178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
2179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* dst.w = 1.0; */
2182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
2183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
2188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = V_SQ_ALU_SRC_1;
2190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = 0;
2191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
2193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
2195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
2196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
2197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
2200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_kill(struct r600_shader_ctx *ctx)
2203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
2205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r;
2206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
2208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = ctx->inst_info->r600_opcode;
2210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = i;
2212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = V_SQ_ALU_SRC_0;
2214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
2216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[1].sel = V_SQ_ALU_SRC_1;
2217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[1].neg = 1;
2218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
2219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
2220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
2221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == 3) {
2222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
2224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
2225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
2226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
2227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* kill must be last in ALU */
2230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->bc->force_add_cf = 1;
2231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->shader->uses_kill = TRUE;
2232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
2233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_lit(struct r600_shader_ctx *ctx)
2236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
2239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int r;
2240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* tmp.x = max(src.y, 0.0) */
2242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
2244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_src(&alu.src[0], &ctx->src[0], 1);
2245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
2246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[1].chan = 1;
2247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.sel = ctx->temp_reg;
2249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.chan = 0;
2250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.write = 1;
2251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.last = 1;
2253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = r600_bytecode_add_alu(ctx->bc, &alu);
2254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r)
2255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
2256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (inst->Dst[0].Register.WriteMask & (1 << 2))
2258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
2259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		int chan;
2260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		int sel;
2261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		int i;
2262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->bc->chip_class == CAYMAN) {
2264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (i = 0; i < 3; i++) {
2265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				/* tmp.z = log(tmp.x) */
2266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
2268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = ctx->temp_reg;
2269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = 0;
2270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = ctx->temp_reg;
2271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = i;
2272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (i == 2) {
2273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.dst.write = 1;
2274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.last = 1;
2275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				} else
2276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.dst.write = 0;
2277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r = r600_bytecode_add_alu(ctx->bc, &alu);
2279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (r)
2280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
2281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
2282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
2283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* tmp.z = log(tmp.x) */
2284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
2286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = ctx->temp_reg;
2287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 0;
2288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = ctx->temp_reg;
2289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 2;
2290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
2291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
2293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
2294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
2295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
2296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		chan = alu.dst.chan;
2298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		sel = alu.dst.sel;
2299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */
2301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
2303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel  = sel;
2304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = chan;
2305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[1], &ctx->src[0], 3);
2306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[2], &ctx->src[0], 0);
2307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->temp_reg;
2308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 0;
2309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
2310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.is_op3 = 1;
2311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
2312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
2313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
2314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
2315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->bc->chip_class == CAYMAN) {
2317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (i = 0; i < 3; i++) {
2318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				/* dst.z = exp(tmp.x) */
2319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
2321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = ctx->temp_reg;
2322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = 0;
2323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (i == 2) {
2325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.dst.write = 1;
2326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.last = 1;
2327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				} else
2328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.dst.write = 0;
2329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r = r600_bytecode_add_alu(ctx->bc, &alu);
2330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (r)
2331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
2332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
2333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
2334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* dst.z = exp(tmp.x) */
2335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
2337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = ctx->temp_reg;
2338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 0;
2339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
2340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
2342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
2343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
2344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
2345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* dst.x, <- 1.0  */
2348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
2351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[0].chan = 0;
2352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
2353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
2354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = r600_bytecode_add_alu(ctx->bc, &alu);
2355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r)
2356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
2357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* dst.y = max(src.x, 0.0) */
2359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
2361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
2363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[1].chan = 0;
2364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
2365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
2366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = r600_bytecode_add_alu(ctx->bc, &alu);
2367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r)
2368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
2369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* dst.w, <- 1.0  */
2371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[0].sel  = V_SQ_ALU_SRC_1;
2374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[0].chan = 0;
2375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
2376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
2377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.last = 1;
2378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = r600_bytecode_add_alu(ctx->bc, &alu);
2379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r)
2380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
2381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
2383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
2386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
2389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r;
2390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* XXX:
2394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * For state trackers other than OpenGL, we'll want to use
2395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * _RECIPSQRT_IEEE instead.
2396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 */
2397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
2398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
2400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
2401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src_set_abs(&alu.src[i]);
2402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.sel = ctx->temp_reg;
2404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.write = 1;
2405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.last = 1;
2406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = r600_bytecode_add_alu(ctx->bc, &alu);
2407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r)
2408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
2409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* replicate result */
2410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return tgsi_helper_tempx_replicate(ctx);
2411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
2414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
2417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r;
2418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
2420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = ctx->temp_reg;
2422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = i;
2424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
2426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == 3)
2427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
2429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
2430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
2431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
2433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
2436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
2439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r;
2440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.inst = ctx->inst_info->r600_opcode;
2443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
2444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
2445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.sel = ctx->temp_reg;
2447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.write = 1;
2448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.last = 1;
2449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = r600_bytecode_add_alu(ctx->bc, &alu);
2450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r)
2451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
2452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* replicate result */
2453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return tgsi_helper_tempx_replicate(ctx);
2454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int cayman_pow(struct r600_shader_ctx *ctx)
2457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r;
2460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
2461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
2462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 3; i++) {
2464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
2466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->temp_reg;
2468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = i;
2469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
2470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == 2)
2471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
2473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
2474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
2475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* b * LOG2(a) */
2478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
2480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
2481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[1].sel = ctx->temp_reg;
2482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.sel = ctx->temp_reg;
2483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.write = 1;
2484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.last = 1;
2485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = r600_bytecode_add_alu(ctx->bc, &alu);
2486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r)
2487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
2488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < last_slot; i++) {
2490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* POW(a,b) = EXP2(b * LOG2(a))*/
2491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
2493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = ctx->temp_reg;
2494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
2497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == last_slot - 1)
2498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
2500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
2501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
2502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
2504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_pow(struct r600_shader_ctx *ctx)
2507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
2509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int r;
2510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* LOG2(a) */
2512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
2514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.sel = ctx->temp_reg;
2516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.write = 1;
2517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.last = 1;
2518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = r600_bytecode_add_alu(ctx->bc, &alu);
2519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r)
2520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
2521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* b * LOG2(a) */
2522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
2524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
2525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[1].sel = ctx->temp_reg;
2526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.sel = ctx->temp_reg;
2527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.write = 1;
2528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.last = 1;
2529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = r600_bytecode_add_alu(ctx->bc, &alu);
2530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r)
2531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
2532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* POW(a,b) = EXP2(b * LOG2(a))*/
2533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
2535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[0].sel = ctx->temp_reg;
2536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.sel = ctx->temp_reg;
2537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.write = 1;
2538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.last = 1;
2539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = r600_bytecode_add_alu(ctx->bc, &alu);
2540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r)
2541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
2542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return tgsi_helper_tempx_replicate(ctx);
2543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_divmod(struct r600_shader_ctx *ctx, int mod, int signed_op)
2546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
2549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r, j;
2550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned write_mask = inst->Dst[0].Register.WriteMask;
2551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int tmp0 = ctx->temp_reg;
2552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int tmp1 = r600_get_temp(ctx);
2553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int tmp2 = r600_get_temp(ctx);
2554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int tmp3 = r600_get_temp(ctx);
2555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Unsigned path:
2556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *
2557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * we need to represent src1 as src2*q + r, where q - quotient, r - remainder
2558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *
2559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 1. tmp0.x = rcp (src2)     = 2^32/src2 + e, where e is rounding error
2560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 2. tmp0.z = lo (tmp0.x * src2)
2561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 3. tmp0.w = -tmp0.z
2562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 4. tmp0.y = hi (tmp0.x * src2)
2563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z)      = abs(lo(rcp*src2))
2564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 6. tmp0.w = hi (tmp0.z * tmp0.x)    = e, rounding error
2565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 7. tmp1.x = tmp0.x - tmp0.w
2566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 8. tmp1.y = tmp0.x + tmp0.w
2567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x)
2568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 10. tmp0.z = hi(tmp0.x * src1)     = q
2569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 11. tmp0.y = lo (tmp0.z * src2)     = src2*q = src1 - r
2570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *
2571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 12. tmp0.w = src1 - tmp0.y       = r
2572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 13. tmp1.x = tmp0.w >= src2		= r >= src2 (uint comparison)
2573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 14. tmp1.y = src1 >= tmp0.y      = r >= 0 (uint comparison)
2574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *
2575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * if DIV
2576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *
2577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *   15. tmp1.z = tmp0.z + 1			= q + 1
2578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *   16. tmp1.w = tmp0.z - 1			= q - 1
2579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *
2580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * else MOD
2581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *
2582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *   15. tmp1.z = tmp0.w - src2			= r - src2
2583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *   16. tmp1.w = tmp0.w + src2			= r + src2
2584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *
2585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * endif
2586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *
2587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 17. tmp1.x = tmp1.x & tmp1.y
2588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *
2589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * DIV: 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z
2590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * MOD: 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z
2591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *
2592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z
2593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * 20. dst = src2==0 ? MAX_UINT : tmp0.z
2594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *
2595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * Signed path:
2596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *
2597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * Same as unsigned, using abs values of the operands,
2598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * and fixing the sign of the result in the end.
2599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 */
2600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
2602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!(write_mask & (1<<i)))
2603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
2604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (signed_op) {
2606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* tmp2.x = -src0 */
2608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = tmp2;
2612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 0;
2613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
2614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = V_SQ_ALU_SRC_0;
2616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
2618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
2622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* tmp2.y = -src1 */
2624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = tmp2;
2628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 1;
2629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
2630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = V_SQ_ALU_SRC_0;
2632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
2638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* tmp2.z sign bit is set if src0 and src2 signs are different */
2640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* it will be a sign of the quotient */
2641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (!mod) {
2642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT);
2645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = tmp2;
2647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = 2;
2648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.write = 1;
2649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
2651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.last = 1;
2654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
2656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
2657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* tmp2.x = |src0| */
2659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
2661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.is_op3 = 1;
2662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = tmp2;
2664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 0;
2665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
2666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
2668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
2669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[2].sel = tmp2;
2670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[2].chan = 0;
2671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
2675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* tmp2.y = |src1| */
2677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
2679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.is_op3 = 1;
2680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = tmp2;
2682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 1;
2683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
2684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
2686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[2].sel = tmp2;
2688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[2].chan = 1;
2689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
2693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
2695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 1. tmp0.x = rcp_u (src2)     = 2^32/src2 + e, where e is rounding error */
2697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->bc->chip_class == CAYMAN) {
2698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* tmp3.x = u2f(src2) */
2699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT);
2701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = tmp3;
2703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 0;
2704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
2705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (signed_op) {
2707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = tmp2;
2708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = 1;
2709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			} else {
2710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
2711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
2712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
2716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* tmp0.x = recip(tmp3.x) */
2718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (j = 0 ; j < 3; j++) {
2719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE;
2721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = tmp0;
2723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = j;
2724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.write = (j == 0);
2725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = tmp3;
2727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = 0;
2728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (j == 2)
2730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.last = 1;
2731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
2733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
2734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
2737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = tmp0;
2739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 0;
2740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
2742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[1].value = 0x4f800000;
2743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = tmp3;
2745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
2746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
2748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
2749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
2750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT);
2753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = tmp0;
2755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 0;
2756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
2757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = tmp3;
2759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 0;
2760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
2764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
2766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_UINT);
2768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = tmp0;
2770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 0;
2771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
2772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (signed_op) {
2774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = tmp2;
2775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = 1;
2776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			} else {
2777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
2778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
2779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
2783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
2784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 2. tmp0.z = lo (tmp0.x * src2) */
2786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->bc->chip_class == CAYMAN) {
2787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (j = 0 ; j < 4; j++) {
2788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
2790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = tmp0;
2792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = j;
2793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.write = (j == 2);
2794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = tmp0;
2796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = 0;
2797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (signed_op) {
2798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.src[1].sel = tmp2;
2799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.src[1].chan = 1;
2800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				} else {
2801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				}
2803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.last = (j == 3);
2805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
2807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
2808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
2809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
2811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = tmp0;
2813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 2;
2814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
2815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = tmp0;
2817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 0;
2818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (signed_op) {
2819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].sel = tmp2;
2820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].chan = 1;
2821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			} else {
2822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
2824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
2828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
2829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 3. tmp0.w = -tmp0.z */
2831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = tmp0;
2835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 3;
2836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
2837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = V_SQ_ALU_SRC_0;
2839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = tmp0;
2840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].chan = 2;
2841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
2843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
2845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 4. tmp0.y = hi (tmp0.x * src2) */
2847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->bc->chip_class == CAYMAN) {
2848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (j = 0 ; j < 4; j++) {
2849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
2851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = tmp0;
2853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = j;
2854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.write = (j == 1);
2855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = tmp0;
2857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = 0;
2858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (signed_op) {
2860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.src[1].sel = tmp2;
2861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.src[1].chan = 1;
2862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				} else {
2863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				}
2865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.last = (j == 3);
2866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
2868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
2869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
2870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
2872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = tmp0;
2874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 1;
2875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
2876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = tmp0;
2878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 0;
2879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (signed_op) {
2881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].sel = tmp2;
2882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].chan = 1;
2883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			} else {
2884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
2886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
2890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
2891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z)      = abs(lo(rcp*src)) */
2893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
2895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.is_op3 = 1;
2896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = tmp0;
2898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 2;
2899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
2900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = tmp0;
2902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = 1;
2903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = tmp0;
2904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].chan = 3;
2905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].sel = tmp0;
2906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].chan = 2;
2907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
2909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
2911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 6. tmp0.w = hi (tmp0.z * tmp0.x)    = e, rounding error */
2913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->bc->chip_class == CAYMAN) {
2914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (j = 0 ; j < 4; j++) {
2915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
2917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = tmp0;
2919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = j;
2920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.write = (j == 3);
2921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = tmp0;
2923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = 2;
2924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].sel = tmp0;
2926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].chan = 0;
2927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.last = (j == 3);
2929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
2931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
2932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
2933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
2935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = tmp0;
2937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 3;
2938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
2939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = tmp0;
2941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 2;
2942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[1].sel = tmp0;
2944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[1].chan = 0;
2945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
2947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
2949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
2950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 7. tmp1.x = tmp0.x - tmp0.w */
2952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = tmp1;
2956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 0;
2957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
2958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = tmp0;
2960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = 0;
2961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = tmp0;
2962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].chan = 3;
2963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
2965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
2967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 8. tmp1.y = tmp0.x + tmp0.w */
2969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
2971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = tmp1;
2973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 1;
2974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
2975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = tmp0;
2977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = 0;
2978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = tmp0;
2979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].chan = 3;
2980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
2982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
2984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x) */
2986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
2988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.is_op3 = 1;
2989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = tmp0;
2991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 0;
2992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
2993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = tmp0;
2995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = 1;
2996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = tmp1;
2997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].chan = 1;
2998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].sel = tmp1;
2999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].chan = 0;
3000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
3002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
3004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 10. tmp0.z = hi(tmp0.x * src1)     = q */
3006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->bc->chip_class == CAYMAN) {
3007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (j = 0 ; j < 4; j++) {
3008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
3010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = tmp0;
3012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = j;
3013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.write = (j == 2);
3014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = tmp0;
3016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = 0;
3017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (signed_op) {
3019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.src[1].sel = tmp2;
3020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.src[1].chan = 0;
3021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				} else {
3022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				}
3024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.last = (j == 3);
3026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
3028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
3029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
3030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
3032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = tmp0;
3034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 2;
3035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
3036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = tmp0;
3038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 0;
3039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (signed_op) {
3041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].sel = tmp2;
3042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].chan = 0;
3043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			} else {
3044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
3046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
3048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
3050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 11. tmp0.y = lo (src2 * tmp0.z)     = src2*q = src1 - r */
3053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->bc->chip_class == CAYMAN) {
3054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (j = 0 ; j < 4; j++) {
3055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
3057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = tmp0;
3059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = j;
3060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.write = (j == 1);
3061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (signed_op) {
3063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.src[0].sel = tmp2;
3064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.src[0].chan = 1;
3065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				} else {
3066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
3067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				}
3068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].sel = tmp0;
3070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].chan = 2;
3071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.last = (j == 3);
3073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
3075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
3076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
3077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
3079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = tmp0;
3081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 1;
3082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
3083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (signed_op) {
3085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = tmp2;
3086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = 1;
3087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			} else {
3088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
3089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
3090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[1].sel = tmp0;
3092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[1].chan = 2;
3093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
3095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
3097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 12. tmp0.w = src1 - tmp0.y       = r */
3100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
3102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = tmp0;
3104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 3;
3105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
3106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (signed_op) {
3108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = tmp2;
3109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 0;
3110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
3111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = tmp0;
3115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].chan = 1;
3116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
3118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
3120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 13. tmp1.x = tmp0.w >= src2		= r >= src2 */
3122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT);
3124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = tmp1;
3126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 0;
3127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
3128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = tmp0;
3130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = 3;
3131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (signed_op) {
3132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[1].sel = tmp2;
3133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[1].chan = 1;
3134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
3135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
3136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
3139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
3141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 14. tmp1.y = src1 >= tmp0.y       = r >= 0 */
3143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT);
3145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = tmp1;
3147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 1;
3148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
3149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (signed_op) {
3151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = tmp2;
3152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 0;
3153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
3154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = tmp0;
3158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].chan = 1;
3159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
3161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
3163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (mod) { /* UMOD */
3165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* 15. tmp1.z = tmp0.w - src2			= r - src2 */
3167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
3169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = tmp1;
3171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 2;
3172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
3173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = tmp0;
3175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 3;
3176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (signed_op) {
3178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].sel = tmp2;
3179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].chan = 1;
3180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			} else {
3181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
3182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
3183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
3185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
3187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* 16. tmp1.w = tmp0.w + src2			= r + src2 */
3189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
3191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = tmp1;
3193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 3;
3194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
3195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = tmp0;
3197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 3;
3198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (signed_op) {
3199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].sel = tmp2;
3200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].chan = 1;
3201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			} else {
3202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
3203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
3204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
3206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
3208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else { /* UDIV */
3210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* 15. tmp1.z = tmp0.z + 1       = q + 1       DIV */
3212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
3214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = tmp1;
3216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 2;
3217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
3218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = tmp0;
3220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 2;
3221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[1].sel = V_SQ_ALU_SRC_1_INT;
3222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
3224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
3226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* 16. tmp1.w = tmp0.z - 1			= q - 1 */
3228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
3230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = tmp1;
3232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 3;
3233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
3234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = tmp0;
3236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 2;
3237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[1].sel = V_SQ_ALU_SRC_M_1_INT;
3238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
3240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
3242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 17. tmp1.x = tmp1.x & tmp1.y */
3246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT);
3248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = tmp1;
3250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 0;
3251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
3252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = tmp1;
3254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = 0;
3255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = tmp1;
3256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].chan = 1;
3257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
3259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
3261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z    DIV */
3263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z    MOD */
3264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
3266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.is_op3 = 1;
3267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = tmp0;
3269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 2;
3270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
3271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = tmp1;
3273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = 0;
3274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = tmp0;
3275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].chan = mod ? 3 : 2;
3276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].sel = tmp1;
3277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].chan = 2;
3278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
3280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
3282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z */
3284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
3286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.is_op3 = 1;
3287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (signed_op) {
3289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = tmp0;
3290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 2;
3291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
3292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
3293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = tmp1;
3297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = 1;
3298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = tmp1;
3299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].chan = 3;
3300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].sel = tmp0;
3301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].chan = 2;
3302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
3304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
3306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (signed_op) {
3308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* fix the sign of the result */
3310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (mod) {
3312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				/* tmp0.x = -tmp0.z */
3314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
3316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = tmp0;
3318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = 0;
3319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.write = 1;
3320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = V_SQ_ALU_SRC_0;
3322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].sel = tmp0;
3323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].chan = 2;
3324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.last = 1;
3326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
3328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				/* sign of the remainder is the same as the sign of src0 */
3330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				/* tmp0.x = src0>=0 ? tmp0.z : tmp0.x */
3331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
3333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.is_op3 = 1;
3334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].sel = tmp0;
3339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].chan = 2;
3340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[2].sel = tmp0;
3341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[2].chan = 0;
3342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.last = 1;
3344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
3346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			} else {
3348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				/* tmp0.x = -tmp0.z */
3350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
3352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = tmp0;
3354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = 0;
3355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.write = 1;
3356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = V_SQ_ALU_SRC_0;
3358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].sel = tmp0;
3359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].chan = 2;
3360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.last = 1;
3362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
3364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				/* fix the quotient sign (same as the sign of src0*src1) */
3366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				/* tmp0.x = tmp2.z>=0 ? tmp0.z : tmp0.x */
3367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
3369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.is_op3 = 1;
3370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = tmp2;
3374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = 2;
3375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].sel = tmp0;
3376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[1].chan = 2;
3377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[2].sel = tmp0;
3378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[2].chan = 0;
3379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.last = 1;
3381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
3383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
3384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
3386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
3387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_udiv(struct r600_shader_ctx *ctx)
3390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return tgsi_divmod(ctx, 0, 0);
3392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_umod(struct r600_shader_ctx *ctx)
3395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return tgsi_divmod(ctx, 1, 0);
3397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_idiv(struct r600_shader_ctx *ctx)
3400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return tgsi_divmod(ctx, 0, 1);
3402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_imod(struct r600_shader_ctx *ctx)
3405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return tgsi_divmod(ctx, 1, 1);
3407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_f2i(struct r600_shader_ctx *ctx)
3411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
3414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r;
3415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned write_mask = inst->Dst[0].Register.WriteMask;
3416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int last_inst = tgsi_last_instruction(write_mask);
3417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
3419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!(write_mask & (1<<i)))
3420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
3421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC);
3424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->temp_reg;
3426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = i;
3427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
3428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == last_inst)
3431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
3432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
3433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
3434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
3435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
3436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
3438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!(write_mask & (1<<i)))
3439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
3440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = ctx->inst_info->r600_opcode;
3443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = ctx->temp_reg;
3447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = i;
3448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == last_inst || alu.inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT)
3450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
3451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
3452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
3453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
3454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
3455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
3457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_iabs(struct r600_shader_ctx *ctx)
3460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
3463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r;
3464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned write_mask = inst->Dst[0].Register.WriteMask;
3465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int last_inst = tgsi_last_instruction(write_mask);
3466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* tmp = -src */
3468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
3469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!(write_mask & (1<<i)))
3470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
3471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
3474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->temp_reg;
3476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = i;
3477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
3478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = V_SQ_ALU_SRC_0;
3481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == last_inst)
3483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
3484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
3485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
3486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
3487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
3488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* dst = (src >= 0 ? src : tmp) */
3490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
3491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!(write_mask & (1<<i)))
3492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
3493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
3496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.is_op3 = 1;
3497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
3498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].sel = ctx->temp_reg;
3504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].chan = i;
3505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == last_inst)
3507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
3508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
3509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
3510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
3511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
3512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
3513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_issg(struct r600_shader_ctx *ctx)
3516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
3519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r;
3520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned write_mask = inst->Dst[0].Register.WriteMask;
3521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int last_inst = tgsi_last_instruction(write_mask);
3522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* tmp = (src >= 0 ? src : -1) */
3524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
3525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!(write_mask & (1<<i)))
3526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
3527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
3530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.is_op3 = 1;
3531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->temp_reg;
3533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = i;
3534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
3535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].sel = V_SQ_ALU_SRC_M_1_INT;
3539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == last_inst)
3541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
3542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
3543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
3544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
3545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
3546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* dst = (tmp > 0 ? 1 : tmp) */
3548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
3549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!(write_mask & (1<<i)))
3550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
3551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT_INT);
3554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.is_op3 = 1;
3555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
3556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = ctx->temp_reg;
3560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = i;
3561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = V_SQ_ALU_SRC_1_INT;
3563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].sel = ctx->temp_reg;
3565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].chan = i;
3566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == last_inst)
3568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
3569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
3570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
3571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
3572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
3573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
3574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_ssg(struct r600_shader_ctx *ctx)
3579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
3582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r;
3583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* tmp = (src > 0 ? 1 : src) */
3585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
3586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
3588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.is_op3 = 1;
3589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->temp_reg;
3591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = i;
3592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = V_SQ_ALU_SRC_1;
3595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[2], &ctx->src[0], i);
3596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == 3)
3598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
3599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
3600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
3601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
3602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
3603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* dst = (-tmp > 0 ? -1 : tmp) */
3605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
3606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
3608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.is_op3 = 1;
3609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = ctx->temp_reg;
3612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = i;
3613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].neg = 1;
3614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = V_SQ_ALU_SRC_1;
3616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].neg = 1;
3617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].sel = ctx->temp_reg;
3619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].chan = i;
3620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == 3)
3622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
3623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
3624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
3625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
3626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
3627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
3628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
3631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
3633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r;
3634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
3636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
3638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
3639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = i;
3640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
3641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
3642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = ctx->temp_reg;
3644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = i;
3645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == 3) {
3647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
3648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
3650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
3651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
3652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
3653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
3654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_op3(struct r600_shader_ctx *ctx)
3657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
3660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, j, r;
3661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
3662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < lasti + 1; i++) {
3664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
3665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
3666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = ctx->inst_info->r600_opcode;
3669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
3670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = i;
3675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
3676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.is_op3 = 1;
3677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == lasti) {
3678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
3679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
3681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
3682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
3683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
3684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
3685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_dp(struct r600_shader_ctx *ctx)
3688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
3691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, j, r;
3692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
3694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = ctx->inst_info->r600_opcode;
3696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
3697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = i;
3702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
3703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* handle some special cases */
3704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (ctx->inst_info->tgsi_opcode) {
3705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case TGSI_OPCODE_DP2:
3706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (i > 1) {
3707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
3708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = alu.src[1].chan = 0;
3709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
3710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
3711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case TGSI_OPCODE_DP3:
3712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (i > 2) {
3713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
3714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = alu.src[1].chan = 0;
3715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
3716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
3717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case TGSI_OPCODE_DPH:
3718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (i == 3) {
3719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = V_SQ_ALU_SRC_1;
3720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = 0;
3721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].neg = 0;
3722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
3723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
3724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
3725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
3726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == 3) {
3728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
3729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
3731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
3732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
3733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
3734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
3735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx,
3738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						    unsigned index)
3739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 	(inst->Src[index].Register.File != TGSI_FILE_TEMPORARY &&
3742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		inst->Src[index].Register.File != TGSI_FILE_INPUT &&
3743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		inst->Src[index].Register.File != TGSI_FILE_OUTPUT) ||
3744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->src[index].neg || ctx->src[index].abs;
3745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx,
3748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					unsigned index)
3749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index;
3752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_tex(struct r600_shader_ctx *ctx)
3755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
3756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	static float one_point_five = 1.5f;
3757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_tex tex;
3759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
3760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned src_gpr;
3761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int r, i, j;
3762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int opcode;
3763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Texture fetch instructions can only use gprs as source.
3764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * Also they cannot negate the source or take the absolute value */
3765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	const boolean src_requires_loading = inst->Instruction.Opcode != TGSI_OPCODE_TXQ_LZ &&
3766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             tgsi_tex_src_requires_loading(ctx, 0);
3767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	boolean src_loaded = FALSE;
3768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned sampler_src_reg = inst->Instruction.Opcode == TGSI_OPCODE_TXQ_LZ ? 0 : 1;
3769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint8_t offset_x = 0, offset_y = 0, offset_z = 0;
3770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	src_gpr = tgsi_tex_get_src_gpr(ctx, 0);
3772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) {
3774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* get offset values */
3775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (inst->Texture.NumOffsets) {
3776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			assert(inst->Texture.NumOffsets == 1);
3777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1;
3779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1;
3780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1;
3781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) {
3783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* TGSI moves the sampler to src reg 3 for TXD */
3784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		sampler_src_reg = 3;
3785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (i = 1; i < 3; i++) {
3787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* set gradients h/v */
3788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&tex, 0, sizeof(struct r600_bytecode_tex));
3789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H :
3790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				SQ_TEX_INST_SET_GRADIENTS_V;
3791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
3792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
3793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (tgsi_tex_src_requires_loading(ctx, i)) {
3795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tex.src_gpr = r600_get_temp(ctx);
3796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tex.src_sel_x = 0;
3797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tex.src_sel_y = 1;
3798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tex.src_sel_z = 2;
3799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tex.src_sel_w = 3;
3800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				for (j = 0; j < 4; j++) {
3802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
3804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        r600_bytecode_src(&alu.src[0], &ctx->src[i], j);
3805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        alu.dst.sel = tex.src_gpr;
3806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        alu.dst.chan = j;
3807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        if (j == 3)
3808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                alu.last = 1;
3809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        alu.dst.write = 1;
3810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        r = r600_bytecode_add_alu(ctx->bc, &alu);
3811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        if (r)
3812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                return r;
3813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				}
3814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			} else {
3816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i);
3817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tex.src_sel_x = ctx->src[i].swizzle[0];
3818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tex.src_sel_y = ctx->src[i].swizzle[1];
3819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tex.src_sel_z = ctx->src[i].swizzle[2];
3820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tex.src_sel_w = ctx->src[i].swizzle[3];
3821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tex.src_rel = ctx->src[i].rel;
3822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
3823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */
3824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7;
3825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
3826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tex.coord_type_x = 1;
3827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tex.coord_type_y = 1;
3828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tex.coord_type_z = 1;
3829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tex.coord_type_w = 1;
3830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
3831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_tex(ctx->bc, &tex);
3832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
3833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
3834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
3836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		int out_chan;
3837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* Add perspective divide */
3838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->bc->chip_class == CAYMAN) {
3839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			out_chan = 2;
3840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (i = 0; i < 3; i++) {
3841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
3843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
3844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = ctx->temp_reg;
3846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = i;
3847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (i == 2)
3848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.last = 1;
3849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (out_chan == i)
3850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.dst.write = 1;
3851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r = r600_bytecode_add_alu(ctx->bc, &alu);
3852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (r)
3853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
3854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
3855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
3857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			out_chan = 3;
3858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
3860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
3861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = ctx->temp_reg;
3863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = out_chan;
3864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
3865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
3866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
3867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
3868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
3869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (i = 0; i < 3; i++) {
3872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
3874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = ctx->temp_reg;
3875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = out_chan;
3876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = ctx->temp_reg;
3878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = i;
3879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
3880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
3881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
3882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
3883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
3886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = V_SQ_ALU_SRC_1;
3887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = 0;
3888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->temp_reg;
3889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 3;
3890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
3891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
3892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
3893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
3894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
3895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		src_loaded = TRUE;
3896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		src_gpr = ctx->temp_reg;
3897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
3898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if ((inst->Texture.Texture == TGSI_TEXTURE_CUBE ||
3900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) &&
3901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    inst->Instruction.Opcode != TGSI_OPCODE_TXQ &&
3902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    inst->Instruction.Opcode != TGSI_OPCODE_TXQ_LZ) {
3903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		static const unsigned src0_swizzle[] = {2, 2, 0, 1};
3905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		static const unsigned src1_swizzle[] = {1, 0, 2, 2};
3906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
3908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (i = 0; i < 4; i++) {
3909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
3911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
3912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]);
3913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = ctx->temp_reg;
3914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = i;
3915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (i == 3)
3916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.last = 1;
3917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
3918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
3919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
3920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
3921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* tmp1.z = RCP_e(|tmp1.z|) */
3924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->bc->chip_class == CAYMAN) {
3925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (i = 0; i < 3; i++) {
3926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
3928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = ctx->temp_reg;
3929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = 2;
3930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].abs = 1;
3931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = ctx->temp_reg;
3932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = i;
3933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (i == 2)
3934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.dst.write = 1;
3935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (i == 2)
3936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.last = 1;
3937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r = r600_bytecode_add_alu(ctx->bc, &alu);
3938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (r)
3939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
3940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
3941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
3942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
3944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = ctx->temp_reg;
3945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 2;
3946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].abs = 1;
3947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = ctx->temp_reg;
3948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 2;
3949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
3950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
3951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
3952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
3953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
3954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
3955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
3957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
3958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * muladd has no writemask, have to use another temp
3959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 */
3960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.is_op3 = 1;
3963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = ctx->temp_reg;
3965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = 0;
3966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = ctx->temp_reg;
3967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].chan = 2;
3968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
3970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].chan = 0;
3971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].value = *(uint32_t *)&one_point_five;
3972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->temp_reg;
3974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 0;
3975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
3976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
3978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
3979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
3980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.is_op3 = 1;
3984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = ctx->temp_reg;
3986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = 1;
3987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = ctx->temp_reg;
3988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].chan = 2;
3989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
3991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].chan = 0;
3992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].value = *(uint32_t *)&one_point_five;
3993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->temp_reg;
3995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 1;
3996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
3997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
3999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
4000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
4001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
4002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* write initial W value into Z component */
4003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) {
4004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
4006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
4007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = ctx->temp_reg;
4008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 2;
4009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
4010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
4011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
4012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
4013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
4014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* for cube forms of lod and bias we need to route the lod
4017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   value into Z */
4018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (inst->Instruction.Opcode == TGSI_OPCODE_TXB ||
4019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    inst->Instruction.Opcode == TGSI_OPCODE_TXL) {
4020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
4022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
4023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = ctx->temp_reg;
4024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 2;
4025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
4026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
4027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
4028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
4029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
4030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		src_loaded = TRUE;
4033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		src_gpr = ctx->temp_reg;
4034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (src_requires_loading && !src_loaded) {
4037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (i = 0; i < 4; i++) {
4038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
4040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
4041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = ctx->temp_reg;
4042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = i;
4043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (i == 3)
4044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.last = 1;
4045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
4046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
4047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
4048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
4049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		src_loaded = TRUE;
4051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		src_gpr = ctx->temp_reg;
4052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	opcode = ctx->inst_info->r600_opcode;
4055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
4056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
4057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
4058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE ||
4059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY ||
4060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) {
4061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (opcode) {
4062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case SQ_TEX_INST_SAMPLE:
4063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			opcode = SQ_TEX_INST_SAMPLE_C;
4064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
4065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case SQ_TEX_INST_SAMPLE_L:
4066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			opcode = SQ_TEX_INST_SAMPLE_C_L;
4067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
4068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case SQ_TEX_INST_SAMPLE_LB:
4069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			opcode = SQ_TEX_INST_SAMPLE_C_LB;
4070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
4071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case SQ_TEX_INST_SAMPLE_G:
4072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			opcode = SQ_TEX_INST_SAMPLE_C_G;
4073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
4074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&tex, 0, sizeof(struct r600_bytecode_tex));
4078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.inst = opcode;
4079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
4081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
4082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.src_gpr = src_gpr;
4083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
4084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
4085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
4086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
4087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
4088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (inst->Instruction.Opcode == TGSI_OPCODE_TXQ_LZ) {
4090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.src_sel_x = 4;
4091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.src_sel_y = 4;
4092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.src_sel_z = 4;
4093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.src_sel_w = 4;
4094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else if (src_loaded) {
4095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.src_sel_x = 0;
4096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.src_sel_y = 1;
4097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.src_sel_z = 2;
4098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.src_sel_w = 3;
4099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
4100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.src_sel_x = ctx->src[0].swizzle[0];
4101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.src_sel_y = ctx->src[0].swizzle[1];
4102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.src_sel_z = ctx->src[0].swizzle[2];
4103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.src_sel_w = ctx->src[0].swizzle[3];
4104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.src_rel = ctx->src[0].rel;
4105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE ||
4108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) {
4109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.src_sel_x = 1;
4110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.src_sel_y = 0;
4111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.src_sel_z = 3;
4112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.src_sel_w = 2; /* route Z compare or Lod value into W */
4113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (inst->Texture.Texture != TGSI_TEXTURE_RECT &&
4116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) {
4117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.coord_type_x = 1;
4118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.coord_type_y = 1;
4119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.coord_type_z = 1;
4121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.coord_type_w = 1;
4122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.offset_x = offset_x;
4124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.offset_y = offset_y;
4125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex.offset_z = offset_z;
4126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Put the depth for comparison in W.
4128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W.
4129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * Some instructions expect the depth in Z. */
4130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
4131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
4132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
4133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) &&
4134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    opcode != SQ_TEX_INST_SAMPLE_C_L &&
4135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    opcode != SQ_TEX_INST_SAMPLE_C_LB) {
4136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.src_sel_w = tex.src_sel_z;
4137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY ||
4140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) {
4141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (opcode == SQ_TEX_INST_SAMPLE_C_L ||
4142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    opcode == SQ_TEX_INST_SAMPLE_C_LB) {
4143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* the array index is read from Y */
4144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tex.coord_type_y = 0;
4145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
4146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* the array index is read from Z */
4147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tex.coord_type_z = 0;
4148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tex.src_sel_z = tex.src_sel_y;
4149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY ||
4151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY)
4152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* the array index is read from Z */
4153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tex.coord_type_z = 0;
4154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = r600_bytecode_add_tex(ctx->bc, &tex);
4156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r)
4157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
4158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* add shadow ambient support  - gallium doesn't do it yet */
4160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
4161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_lrp(struct r600_shader_ctx *ctx)
4164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
4166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
4167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
4168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned i;
4169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int r;
4170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* optimize if it's just an equal balance */
4172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) {
4173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (i = 0; i < lasti + 1; i++) {
4174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				continue;
4176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
4179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
4180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.omod = 3;
4182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = i;
4184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (i == lasti) {
4185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.last = 1;
4186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
4187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
4188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
4189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
4190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return 0;
4192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 1 - src0 */
4195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < lasti + 1; i++) {
4196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
4198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
4201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = V_SQ_ALU_SRC_1;
4202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = 0;
4203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
4204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src_toggle_neg(&alu.src[1]);
4205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->temp_reg;
4206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = i;
4207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == lasti) {
4208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
4209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
4211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
4212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
4213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
4214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* (1 - src0) * src2 */
4217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < lasti + 1; i++) {
4218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
4220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
4223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = ctx->temp_reg;
4224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = i;
4225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->temp_reg;
4227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = i;
4228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == lasti) {
4229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
4230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
4232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
4233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
4234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
4235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* src0 * src1 + (1 - src0) * src2 */
4238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < lasti + 1; i++) {
4239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
4241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
4244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.is_op3 = 1;
4245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
4246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
4247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].sel = ctx->temp_reg;
4248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].chan = i;
4249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = i;
4252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == lasti) {
4253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
4254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
4256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
4257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
4258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
4260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_cmp(struct r600_shader_ctx *ctx)
4263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
4265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
4266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r;
4267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
4268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < lasti + 1; i++) {
4270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
4272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
4275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
4276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[2], &ctx->src[1], i);
4278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = i;
4280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
4281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.is_op3 = 1;
4282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == lasti)
4283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
4284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
4285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
4286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
4287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
4289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_xpd(struct r600_shader_ctx *ctx)
4292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
4294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	static const unsigned int src0_swizzle[] = {2, 0, 1};
4295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	static const unsigned int src1_swizzle[] = {1, 2, 0};
4296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
4297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t use_temp = 0;
4298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r;
4299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (inst->Dst[0].Register.WriteMask != 0xf)
4301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		use_temp = 1;
4302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
4304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
4306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i < 3) {
4307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
4308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]);
4309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
4310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = V_SQ_ALU_SRC_0;
4311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = i;
4312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[1].sel = V_SQ_ALU_SRC_0;
4313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[1].chan = i;
4314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->temp_reg;
4317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = i;
4318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
4319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == 3)
4321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
4322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
4323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
4324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
4325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
4328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
4330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i < 3) {
4332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]);
4333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]);
4334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
4335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = V_SQ_ALU_SRC_0;
4336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = i;
4337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[1].sel = V_SQ_ALU_SRC_0;
4338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[1].chan = i;
4339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].sel = ctx->temp_reg;
4342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].neg = 1;
4343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[2].chan = i;
4344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (use_temp)
4346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = ctx->temp_reg;
4347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else
4348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = i;
4350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
4351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.is_op3 = 1;
4352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == 3)
4353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
4354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
4355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
4356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
4357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (use_temp)
4359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return tgsi_helper_copy(ctx, inst);
4360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
4361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_exp(struct r600_shader_ctx *ctx)
4364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
4366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
4367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int r;
4368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i;
4369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* result.x = 2^floor(src); */
4371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (inst->Dst[0].Register.WriteMask & 1) {
4372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
4375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->temp_reg;
4378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 0;
4379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
4380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
4381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
4382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
4383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
4384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->bc->chip_class == CAYMAN) {
4386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (i = 0; i < 3; i++) {
4387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
4388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = ctx->temp_reg;
4389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = 0;
4390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = ctx->temp_reg;
4392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = i;
4393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.write = i == 0;
4394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.last = i == 2;
4395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r = r600_bytecode_add_alu(ctx->bc, &alu);
4396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (r)
4397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
4398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
4399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
4400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
4401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = ctx->temp_reg;
4402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 0;
4403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = ctx->temp_reg;
4405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 0;
4406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
4407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
4408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
4409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
4410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
4411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* result.y = tmp - floor(tmp); */
4415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
4416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
4419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->temp_reg;
4422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
4423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
4425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
4426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
4427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
4428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 1;
4429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
4431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
4433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
4434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
4435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* result.z = RoughApprox2ToX(tmp);*/
4438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
4439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->bc->chip_class == CAYMAN) {
4440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (i = 0; i < 3; i++) {
4441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
4443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = ctx->temp_reg;
4446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = i;
4447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (i == 2) {
4448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.dst.write = 1;
4449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.last = 1;
4450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				}
4451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r = r600_bytecode_add_alu(ctx->bc, &alu);
4453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (r)
4454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
4455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
4456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
4457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
4459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = ctx->temp_reg;
4462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
4463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 2;
4464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
4466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
4468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
4469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
4470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* result.w = 1.0;*/
4474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
4475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
4478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = V_SQ_ALU_SRC_1;
4479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = 0;
4480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->temp_reg;
4482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 3;
4483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
4484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
4485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
4486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
4487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
4488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return tgsi_helper_copy(ctx, inst);
4490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_log(struct r600_shader_ctx *ctx)
4493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
4495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
4496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int r;
4497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i;
4498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* result.x = floor(log2(|src|)); */
4500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (inst->Dst[0].Register.WriteMask & 1) {
4501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->bc->chip_class == CAYMAN) {
4502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (i = 0; i < 3; i++) {
4503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
4506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src_set_abs(&alu.src[0]);
4508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = ctx->temp_reg;
4510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = i;
4511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (i == 0)
4512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.dst.write = 1;
4513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (i == 2)
4514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.last = 1;
4515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r = r600_bytecode_add_alu(ctx->bc, &alu);
4516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (r)
4517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
4518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
4519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
4521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
4524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src_set_abs(&alu.src[0]);
4526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = ctx->temp_reg;
4528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 0;
4529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
4530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
4531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
4532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
4533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
4534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
4537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = ctx->temp_reg;
4538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = 0;
4539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->temp_reg;
4541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 0;
4542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
4543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
4544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
4546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
4547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
4548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */
4551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
4552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->bc->chip_class == CAYMAN) {
4554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (i = 0; i < 3; i++) {
4555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
4558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src_set_abs(&alu.src[0]);
4560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = ctx->temp_reg;
4562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = i;
4563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (i == 1)
4564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.dst.write = 1;
4565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (i == 2)
4566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.last = 1;
4567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r = r600_bytecode_add_alu(ctx->bc, &alu);
4569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (r)
4570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
4571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
4572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
4573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
4576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src_set_abs(&alu.src[0]);
4578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = ctx->temp_reg;
4580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 1;
4581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
4582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
4583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
4585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
4586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
4587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
4592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = ctx->temp_reg;
4593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = 1;
4594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->temp_reg;
4596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 1;
4597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
4598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
4599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
4601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
4602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
4603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->bc->chip_class == CAYMAN) {
4605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (i = 0; i < 3; i++) {
4606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
4608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = ctx->temp_reg;
4609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = 1;
4610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = ctx->temp_reg;
4612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = i;
4613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (i == 1)
4614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.dst.write = 1;
4615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (i == 2)
4616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.last = 1;
4617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r = r600_bytecode_add_alu(ctx->bc, &alu);
4619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (r)
4620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
4621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
4622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
4623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
4625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = ctx->temp_reg;
4626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 1;
4627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = ctx->temp_reg;
4629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 1;
4630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
4631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
4632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
4634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
4635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
4636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->bc->chip_class == CAYMAN) {
4639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (i = 0; i < 3; i++) {
4640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
4642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].sel = ctx->temp_reg;
4643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.src[0].chan = 1;
4644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = ctx->temp_reg;
4646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = i;
4647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (i == 1)
4648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.dst.write = 1;
4649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (i == 2)
4650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.last = 1;
4651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r = r600_bytecode_add_alu(ctx->bc, &alu);
4653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (r)
4654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
4655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
4656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
4657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
4659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = ctx->temp_reg;
4660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].chan = 1;
4661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = ctx->temp_reg;
4663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 1;
4664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
4665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
4666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
4668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
4669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
4670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
4675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src_set_abs(&alu.src[0]);
4678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].sel = ctx->temp_reg;
4680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[1].chan = 1;
4681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->temp_reg;
4683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 1;
4684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
4685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
4686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
4688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
4689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
4690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* result.z = log2(|src|);*/
4693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
4694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->bc->chip_class == CAYMAN) {
4695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (i = 0; i < 3; i++) {
4696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
4699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r600_bytecode_src_set_abs(&alu.src[0]);
4701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.sel = ctx->temp_reg;
4703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (i == 2)
4704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.dst.write = 1;
4705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu.dst.chan = i;
4706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (i == 2)
4707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					alu.last = 1;
4708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				r = r600_bytecode_add_alu(ctx->bc, &alu);
4710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (r)
4711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return r;
4712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
4713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
4714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
4717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src_set_abs(&alu.src[0]);
4719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.sel = ctx->temp_reg;
4721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.write = 1;
4722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.dst.chan = 2;
4723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
4724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r = r600_bytecode_add_alu(ctx->bc, &alu);
4726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (r)
4727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return r;
4728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* result.w = 1.0; */
4732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
4733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
4736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = V_SQ_ALU_SRC_1;
4737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = 0;
4738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->temp_reg;
4740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = 3;
4741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
4742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
4743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
4745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
4746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
4747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return tgsi_helper_copy(ctx, inst);
4750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
4753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
4755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
4756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int r;
4757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (inst->Instruction.Opcode) {
4761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case TGSI_OPCODE_ARL:
4762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
4763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
4764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case TGSI_OPCODE_ARR:
4765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
4766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
4767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case TGSI_OPCODE_UARL:
4768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
4769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
4770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
4771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		assert(0);
4772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return -1;
4773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.last = 1;
4777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.sel = ctx->bc->ar_reg;
4778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.write = 1;
4779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = r600_bytecode_add_alu(ctx->bc, &alu);
4780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r)
4781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
4782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->bc->ar_loaded = 0;
4784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
4785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
4787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
4789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
4790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int r;
4791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (inst->Instruction.Opcode) {
4793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case TGSI_OPCODE_ARL:
4794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(alu));
4795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR;
4796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->bc->ar_reg;
4798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
4799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
4800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
4803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(alu));
4805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
4806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = ctx->bc->ar_reg;
4807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->bc->ar_reg;
4808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
4809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
4810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
4813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
4814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case TGSI_OPCODE_ARR:
4815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(alu));
4816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
4817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->bc->ar_reg;
4819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
4820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
4821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
4824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
4825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case TGSI_OPCODE_UARL:
4826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(alu));
4827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
4828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->bc->ar_reg;
4830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
4831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
4832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
4835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
4836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
4837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		assert(0);
4838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return -1;
4839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->bc->ar_loaded = 0;
4842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
4843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_opdst(struct r600_shader_ctx *ctx)
4846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
4848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
4849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, r = 0;
4850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
4852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
4855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == 0 || i == 3) {
4858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[0].sel = V_SQ_ALU_SRC_1;
4859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
4860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
4861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == 0 || i == 2) {
4864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.src[1].sel = V_SQ_ALU_SRC_1;
4865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
4866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
4867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == 3)
4869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
4870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
4871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
4872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
4873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
4875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
4878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
4880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int r;
4881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.inst = opcode;
4884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.execute_mask = 1;
4885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.update_pred = 1;
4886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.sel = ctx->temp_reg;
4888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.write = 1;
4889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.dst.chan = 0;
4890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[1].sel = V_SQ_ALU_SRC_0;
4893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.src[1].chan = 0;
4894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alu.last = 1;
4896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
4898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r)
4899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return r;
4900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
4901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int pops(struct r600_shader_ctx *ctx, int pops)
4904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned force_pop = ctx->bc->force_add_cf;
4906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!force_pop) {
4908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		int alu_pop = 3;
4909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (ctx->bc->cf_last) {
4910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU))
4911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu_pop = 0;
4912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER))
4913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				alu_pop = 1;
4914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu_pop += pops;
4916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (alu_pop == 1) {
4917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER);
4918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx->bc->force_add_cf = 1;
4919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else if (alu_pop == 2) {
4920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER);
4921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx->bc->force_add_cf = 1;
4922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
4923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			force_pop = 1;
4924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (force_pop) {
4928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
4929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->bc->cf_last->pop_count = pops;
4930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
4931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
4934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
4937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch(reason) {
4939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case FC_PUSH_VPM:
4940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->bc->callstack[ctx->bc->call_sp].current--;
4941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
4942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case FC_PUSH_WQM:
4943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case FC_LOOP:
4944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
4945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
4946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case FC_REP:
4947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* TOODO : for 16 vp asic should -= 2; */
4948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->bc->callstack[ctx->bc->call_sp].current --;
4949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
4950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
4954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (check_max_only) {
4956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		int diff;
4957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (reason) {
4958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case FC_PUSH_VPM:
4959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			diff = 1;
4960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
4961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case FC_PUSH_WQM:
4962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			diff = 4;
4963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
4964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
4965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			assert(0);
4966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			diff = 0;
4967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
4969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    ctx->bc->callstack[ctx->bc->call_sp].max) {
4970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx->bc->callstack[ctx->bc->call_sp].max =
4971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
4972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
4973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
4974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (reason) {
4976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case FC_PUSH_VPM:
4977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->bc->callstack[ctx->bc->call_sp].current++;
4978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
4979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case FC_PUSH_WQM:
4980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case FC_LOOP:
4981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
4982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
4983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case FC_REP:
4984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->bc->callstack[ctx->bc->call_sp].current++;
4985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
4986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
4989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ctx->bc->callstack[ctx->bc->call_sp].max) {
4990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->bc->callstack[ctx->bc->call_sp].max =
4991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ctx->bc->callstack[ctx->bc->call_sp].current;
4992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
4993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
4994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
4996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
4997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
4998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid,
5000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1));
5001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	sp->mid[sp->num_mid] = ctx->bc->cf_last;
5002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	sp->num_mid++;
5003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
5004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
5006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
5007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->bc->fc_sp++;
5008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
5009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
5010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
5011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void fc_poplevel(struct r600_shader_ctx *ctx)
5013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
5014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
5015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (sp->mid) {
5016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		free(sp->mid);
5017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		sp->mid = NULL;
5018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
5019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	sp->num_mid = 0;
5020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	sp->start = NULL;
5021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	sp->type = 0;
5022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->bc->fc_sp--;
5023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
5024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
5026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int emit_return(struct r600_shader_ctx *ctx)
5027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
5028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN));
5029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
5030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
5031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
5033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
5034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
5036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->bc->cf_last->pop_count = pops;
5037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* XXX work out offset */
5038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
5039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
5040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
5042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
5043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
5044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
5045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_testflag(struct r600_shader_ctx *ctx)
5047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
5048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
5050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
5052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
5053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	emit_testflag(ctx);
5054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	emit_jump_to_offset(ctx, 1, 4);
5055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
5056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pops(ctx, ifidx + 1);
5057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	emit_return(ctx);
5058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
5059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
5061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
5062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	emit_testflag(ctx);
5063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
5065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->bc->cf_last->pop_count = 1;
5066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	fc_set_mid(ctx, fc_sp);
5068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pops(ctx, 1);
5070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
5071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
5072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_if(struct r600_shader_ctx *ctx)
5074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
5075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
5076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
5078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	fc_pushlevel(ctx, FC_IF);
5080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
5082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
5083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
5084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_else(struct r600_shader_ctx *ctx)
5086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
5087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
5088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->bc->cf_last->pop_count = 1;
5089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	fc_set_mid(ctx, ctx->bc->fc_sp);
5091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
5092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
5093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
5094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_endif(struct r600_shader_ctx *ctx)
5096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
5097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pops(ctx, 1);
5098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
5099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("if/endif unbalanced in shader\n");
5100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return -1;
5101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
5102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
5104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
5105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
5106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
5107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
5108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
5109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	fc_poplevel(ctx);
5110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	callstack_decrease_current(ctx, FC_PUSH_VPM);
5112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
5113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
5114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
5116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
5117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* LOOP_START_DX10 ignores the LOOP_CONFIG* registers, so it is not
5118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * limited to 4096 iterations, like the other LOOP_* instructions. */
5119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_DX10));
5120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	fc_pushlevel(ctx, FC_LOOP);
5122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* check stack depth */
5124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	callstack_check_depth(ctx, FC_LOOP, 0);
5125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
5126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
5127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_endloop(struct r600_shader_ctx *ctx)
5129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
5130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i;
5131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
5133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
5135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("loop/endloop in shader code are not paired.\n");
5136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return -EINVAL;
5137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
5138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* fixup loop pointers - from r600isa
5140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   LOOP END points to CF after LOOP START,
5141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   LOOP START point to CF after LOOP END
5142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   BRK/CONT point to LOOP END CF
5143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	*/
5144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
5145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
5147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
5149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
5150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
5151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* XXX add LOOPRET support */
5152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	fc_poplevel(ctx);
5153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	callstack_decrease_current(ctx, FC_LOOP);
5154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
5155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
5156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
5158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
5159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int fscp;
5160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
5162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
5163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
5164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
5165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
5166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (fscp == 0) {
5168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("Break not inside loop/endloop pair\n");
5169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return -EINVAL;
5170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
5171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
5173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	fc_set_mid(ctx, fscp);
5175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
5177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
5178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
5179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_umad(struct r600_shader_ctx *ctx)
5181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
5182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_bytecode_alu alu;
5184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, j, r;
5185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
5186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* src0 * src1 */
5188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < lasti + 1; i++) {
5189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
5190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
5191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
5193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.chan = i;
5195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.sel = ctx->temp_reg;
5196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.dst.write = 1;
5197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
5199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (j = 0; j < 2; j++) {
5200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		        r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
5201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
5202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.last = 1;
5204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
5205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
5206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
5207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
5208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < lasti + 1; i++) {
5211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
5212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
5213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
5215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
5216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
5218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].sel = ctx->temp_reg;
5220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alu.src[0].chan = i;
5221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
5223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == lasti) {
5224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			alu.last = 1;
5225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
5226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = r600_bytecode_add_alu(ctx->bc, &alu);
5227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (r)
5228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
5229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
5230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
5231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
5232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
5234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
5235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
5236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
5237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* XXX:
5239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * For state trackers other than OpenGL, we'll want to use
5240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * _RECIP_IEEE instead.
5241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 */
5242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
5243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
5245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
5246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
5247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
5248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
5249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
5252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
5253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
5254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
5255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
5256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
5257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
5258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
5259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
5267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
5270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
5271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
5272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
5273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
5274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
5277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
5280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
5281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
5282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
5283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
5289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
5291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
5292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
5293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
5294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
5296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
5297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
5298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
5305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
5309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
5310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
5312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
5316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
5317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
5318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
5322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
5323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2},
5329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
5330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
5331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2_trans},
5333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
5337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
5339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
5341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
5342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
5343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
5346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
5348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXQ_LZ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
5350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
5365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
5366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2_trans},
5369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
5372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2_trans},
5375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2_trans},
5377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
5378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
5379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
5383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
5384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
5385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2_trans},
5388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap},
5390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_I,  0, 0, tgsi_unsupported},
5396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported},
5397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SVIEWINFO,	0, 0, tgsi_unsupported},
5404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
5406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UARL,      0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl},
5407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
5408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
5409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
5410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
5412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
5414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
5415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
5416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
5417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
5418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq},
5419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
5420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
5421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
5422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
5423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
5426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
5427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
5428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
5429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
5430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
5431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
5432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
5433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
5441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
5444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
5445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
5446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
5447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
5448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
5451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
5454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
5455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
5456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
5457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
5463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
5465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
5466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
5467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
5468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
5470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
5471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
5472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
5479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
5483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
5484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
5486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
5490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
5491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
5492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
5496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
5497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2},
5503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
5504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
5505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2},
5507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
5511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
5513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
5515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
5516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
5517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
5520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
5522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXQ_LZ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
5524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
5539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
5540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_f2i},
5543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
5546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2},
5549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_f2i},
5551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
5552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
5553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
5557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
5558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
5559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2},
5562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
5564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_I,      0, 0, tgsi_unsupported},
5570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_I_MS,   0, 0, tgsi_unsupported},
5571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SVIEWINFO,	0, 0, tgsi_unsupported},
5578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
5580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
5581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
5582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
5583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
5584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
5586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = {
5588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
5589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
5590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
5591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr},
5592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr},
5593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
5594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
5595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
5596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
5597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
5600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
5601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
5602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
5603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
5604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
5605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
5606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
5607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
5615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
5618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr},
5619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr},
5620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow},
5621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
5622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
5625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig},
5628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
5629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
5630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
5631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
5637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
5639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig},
5640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
5641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
5642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
5644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
5645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
5646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
5653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
5657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
5658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
5660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
5664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
5665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
5666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
5670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
5671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2},
5677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2},
5678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
5679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2},
5681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
5685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
5687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
5689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
5690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
5691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
5694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
5696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_TXQ_LZ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
5698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
5713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
5714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* gap */
5715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2},
5717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
5720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2},
5723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2},
5725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2},
5726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
5727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
5731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
5732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_INT, cayman_mul_int_instr},
5733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2},
5736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
5738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_I,      0, 0, tgsi_unsupported},
5744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_I_MS,   0, 0, tgsi_unsupported},
5745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SVIEWINFO,	0, 0, tgsi_unsupported},
5752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
5754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
5755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
5756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
5757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
5758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
5760