r600_llvm.c revision fa5a963dd6c2622c416d53e49b08c4b3cbce7483
12da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard#include "r600_llvm.h"
22da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
32da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard#include "gallivm/lp_bld_const.h"
42da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard#include "gallivm/lp_bld_intr.h"
52da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard#include "gallivm/lp_bld_gather.h"
62da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard#include "tgsi/tgsi_parse.h"
72da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard#include "util/u_double_list.h"
8fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin#include "util/u_memory.h"
92da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
102da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard#include "r600.h"
112da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard#include "r600_asm.h"
122da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard#include "r600_opcodes.h"
132da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard#include "r600_shader.h"
142da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard#include "radeon_llvm.h"
152da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard#include "radeon_llvm_emit.h"
162da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
172da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard#include <stdio.h>
182da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
192da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellardstatic LLVMValueRef llvm_fetch_const(
202da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct lp_build_tgsi_context * bld_base,
212da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	const struct tgsi_full_src_register *reg,
222da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	enum tgsi_opcode_type type,
232da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned swizzle)
242da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard{
2512a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin	LLVMValueRef idx = lp_build_const_int32(bld_base->base.gallivm,
2612a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin			radeon_llvm_reg_index_soa(reg->Register.Index, swizzle));
2712a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin	LLVMValueRef cval = build_intrinsic(bld_base->base.gallivm->builder,
282da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		"llvm.AMDGPU.load.const", bld_base->base.elem_type,
2912a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin		&idx, 1, LLVMReadNoneAttribute);
302a88dfc521bff7255e27e2ef8efcd08f9db53747Vadim Girlin
312a88dfc521bff7255e27e2ef8efcd08f9db53747Vadim Girlin	return bitcast(bld_base, type, cval);
322da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard}
332da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
34d8a120485444968c930f0ab675473692b221cb75Vadim Girlinstatic void llvm_load_system_value(
35d8a120485444968c930f0ab675473692b221cb75Vadim Girlin		struct radeon_llvm_context * ctx,
36d8a120485444968c930f0ab675473692b221cb75Vadim Girlin		unsigned index,
37d8a120485444968c930f0ab675473692b221cb75Vadim Girlin		const struct tgsi_full_declaration *decl)
38d8a120485444968c930f0ab675473692b221cb75Vadim Girlin{
39d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	unsigned chan;
40d8a120485444968c930f0ab675473692b221cb75Vadim Girlin
41d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	switch (decl->Semantic.Name) {
42d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	case TGSI_SEMANTIC_INSTANCEID: chan = 3; break;
43d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	case TGSI_SEMANTIC_VERTEXID: chan = 0; break;
44d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	default: assert(!"unknown system value");
45d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	}
46d8a120485444968c930f0ab675473692b221cb75Vadim Girlin
47d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	LLVMValueRef reg = lp_build_const_int32(
48d8a120485444968c930f0ab675473692b221cb75Vadim Girlin			ctx->soa.bld_base.base.gallivm, chan);
4912a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin	ctx->system_values[index] = build_intrinsic(
50d8a120485444968c930f0ab675473692b221cb75Vadim Girlin			ctx->soa.bld_base.base.gallivm->builder,
51d8a120485444968c930f0ab675473692b221cb75Vadim Girlin			"llvm.R600.load.input",
5212a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin			ctx->soa.bld_base.base.elem_type, &reg, 1,
5312a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin			LLVMReadNoneAttribute);
54d8a120485444968c930f0ab675473692b221cb75Vadim Girlin}
55d8a120485444968c930f0ab675473692b221cb75Vadim Girlin
56d8a120485444968c930f0ab675473692b221cb75Vadim Girlinstatic LLVMValueRef llvm_fetch_system_value(
57d8a120485444968c930f0ab675473692b221cb75Vadim Girlin		struct lp_build_tgsi_context * bld_base,
58d8a120485444968c930f0ab675473692b221cb75Vadim Girlin		const struct tgsi_full_src_register *reg,
59d8a120485444968c930f0ab675473692b221cb75Vadim Girlin		enum tgsi_opcode_type type,
60d8a120485444968c930f0ab675473692b221cb75Vadim Girlin		unsigned swizzle)
61d8a120485444968c930f0ab675473692b221cb75Vadim Girlin{
62d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	struct radeon_llvm_context * ctx = radeon_llvm_context(bld_base);
63d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	LLVMValueRef cval = ctx->system_values[reg->Register.Index];
64d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	return bitcast(bld_base, type, cval);
65d8a120485444968c930f0ab675473692b221cb75Vadim Girlin}
66d8a120485444968c930f0ab675473692b221cb75Vadim Girlin
672da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellardstatic void llvm_load_input(
682da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct radeon_llvm_context * ctx,
692da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned input_index,
702da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	const struct tgsi_full_declaration *decl)
712da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard{
722da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned chan;
732da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
742da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	for (chan = 0; chan < 4; chan++) {
752da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		unsigned soa_index = radeon_llvm_reg_index_soa(input_index,
762da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard								chan);
772da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
782da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		/* The * 4 is assuming that we are in soa mode. */
792da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		LLVMValueRef reg = lp_build_const_int32(
802da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				ctx->soa.bld_base.base.gallivm,
812da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				soa_index + (ctx->reserved_reg_count * 4));
8212a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin		ctx->inputs[soa_index] = build_intrinsic(
832da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				ctx->soa.bld_base.base.gallivm->builder,
842da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				"llvm.R600.load.input",
8512a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin				ctx->soa.bld_base.base.elem_type, &reg, 1,
8612a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin				LLVMReadNoneAttribute);
872da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	}
882da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard}
892da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
902da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellardstatic void llvm_emit_prologue(struct lp_build_tgsi_context * bld_base)
912da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard{
922da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct radeon_llvm_context * ctx = radeon_llvm_context(bld_base);
932da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct lp_build_context * base = &bld_base->base;
942da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned i;
952da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
962da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	/* Reserve special input registers */
972da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	for (i = 0; i < ctx->reserved_reg_count; i++) {
982da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		unsigned chan;
992da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		for (chan = 0; chan < TGSI_NUM_CHANNELS; chan++) {
1002da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard			LLVMValueRef reg_index = lp_build_const_int32(
1012da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard					base->gallivm,
1022da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard					radeon_llvm_reg_index_soa(i, chan));
1032da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard			lp_build_intrinsic_unary(base->gallivm->builder,
1048a4c25dd7e9002ab7a2821753bcae1ff6af2ca1cTom Stellard				"llvm.AMDGPU.reserve.reg",
1052da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				LLVMVoidTypeInContext(base->gallivm->context),
1068a4c25dd7e9002ab7a2821753bcae1ff6af2ca1cTom Stellard				reg_index);
1072da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		}
1082da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	}
1092da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard}
1102da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
1112da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellardstatic void llvm_emit_epilogue(struct lp_build_tgsi_context * bld_base)
1122da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard{
1132da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct radeon_llvm_context * ctx = radeon_llvm_context(bld_base);
1142da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct lp_build_context * base = &bld_base->base;
1152da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned i;
1162da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
1172da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	/* Add the necessary export instructions */
1182da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	for (i = 0; i < ctx->output_reg_count; i++) {
1192da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		unsigned chan;
1202da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		for (chan = 0; chan < TGSI_NUM_CHANNELS; chan++) {
1212da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard			LLVMValueRef output;
1222da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard			unsigned adjusted_reg_idx = i +
1232da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard					ctx->reserved_reg_count;
1242da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard			LLVMValueRef reg_index = lp_build_const_int32(
1252da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				base->gallivm,
1262da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				radeon_llvm_reg_index_soa(adjusted_reg_idx, chan));
1272da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
1282da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard			output = LLVMBuildLoad(base->gallivm->builder,
1292da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				ctx->soa.outputs[i][chan], "");
1302da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
131a8d82c44f79e27d2b78458f9ea560c73eef3d3b5Tom Stellard			lp_build_intrinsic_binary(
1322da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				base->gallivm->builder,
1332da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				"llvm.AMDGPU.store.output",
1342da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				LLVMVoidTypeInContext(base->gallivm->context),
135a8d82c44f79e27d2b78458f9ea560c73eef3d3b5Tom Stellard				output, reg_index);
1362da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		}
1372da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	}
1382da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard}
1392da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
1402da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellardstatic void llvm_emit_tex(
1412da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	const struct lp_build_tgsi_action * action,
1422da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct lp_build_tgsi_context * bld_base,
1432da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct lp_build_emit_data * emit_data)
1442da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard{
1452da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct gallivm_state * gallivm = bld_base->base.gallivm;
146fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin	LLVMValueRef args[6];
147fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin	unsigned c;
1482da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
149fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin	assert(emit_data->arg_count + 2 <= Elements(args));
150fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin
151fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin	for (c = 0; c < emit_data->arg_count; ++c)
152fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin		args[c] = emit_data->args[c];
153fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin
154fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin	args[c++] = lp_build_const_int32(gallivm,
1552da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard					emit_data->inst->Src[1].Register.Index);
156fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin	args[c++] = lp_build_const_int32(gallivm,
1572da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard					emit_data->inst->Texture.Texture);
158fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin
15912a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin	emit_data->output[0] = build_intrinsic(gallivm->builder,
1602da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard					action->intr_name,
161fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin					emit_data->dst_type, args, c, LLVMReadNoneAttribute);
1622da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard}
1632da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
1642da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellardstatic void dp_fetch_args(
1652da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct lp_build_tgsi_context * bld_base,
1662da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct lp_build_emit_data * emit_data)
1672da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard{
1682da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct lp_build_context * base = &bld_base->base;
1692da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned chan;
1702da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	LLVMValueRef elements[2][4];
1712da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned opcode = emit_data->inst->Instruction.Opcode;
1722da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned dp_components = (opcode == TGSI_OPCODE_DP2 ? 2 :
1732da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard					(opcode == TGSI_OPCODE_DP3 ? 3 : 4));
1742da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	for (chan = 0 ; chan < dp_components; chan++) {
1752da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		elements[0][chan] = lp_build_emit_fetch(bld_base,
1762da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard						emit_data->inst, 0, chan);
1772da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		elements[1][chan] = lp_build_emit_fetch(bld_base,
1782da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard						emit_data->inst, 1, chan);
1792da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	}
1802da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
1812da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	for ( ; chan < 4; chan++) {
1822da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		elements[0][chan] = base->zero;
1832da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		elements[1][chan] = base->zero;
1842da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	}
1852da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
1862da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	 /* Fix up for DPH */
1872da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	if (opcode == TGSI_OPCODE_DPH) {
1882da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		elements[0][TGSI_CHAN_W] = base->one;
1892da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	}
1902da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
1912da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	emit_data->args[0] = lp_build_gather_values(bld_base->base.gallivm,
1922da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard							elements[0], 4);
1932da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	emit_data->args[1] = lp_build_gather_values(bld_base->base.gallivm,
1942da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard							elements[1], 4);
1952da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	emit_data->arg_count = 2;
1962da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
1972da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	emit_data->dst_type = base->elem_type;
1982da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard}
1992da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2002da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellardstatic struct lp_build_tgsi_action dot_action = {
2012da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	.fetch_args = dp_fetch_args,
20212a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin	.emit = build_tgsi_intrinsic_nomem,
2032da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	.intr_name = "llvm.AMDGPU.dp4"
2042da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard};
2052da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2062da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2072da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2082da961056600d3f2d94a581c19bfcc1e636e8f41Tom StellardLLVMModuleRef r600_tgsi_llvm(
2092da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct radeon_llvm_context * ctx,
2102da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	const struct tgsi_token * tokens)
2112da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard{
2122da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct tgsi_shader_info shader_info;
2132da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct lp_build_tgsi_context * bld_base = &ctx->soa.bld_base;
2142da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	radeon_llvm_context_init(ctx);
2152da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	tgsi_scan_shader(tokens, &shader_info);
2162da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2172da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->info = &shader_info;
2182da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->userdata = ctx;
2192da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->emit_fetch_funcs[TGSI_FILE_CONSTANT] = llvm_fetch_const;
220d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	bld_base->emit_fetch_funcs[TGSI_FILE_SYSTEM_VALUE] = llvm_fetch_system_value;
2212da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->emit_prologue = llvm_emit_prologue;
2222da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->emit_epilogue = llvm_emit_epilogue;
2232da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	ctx->userdata = ctx;
2242da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	ctx->load_input = llvm_load_input;
225d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	ctx->load_system_value = llvm_load_system_value;
2262da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2272da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->op_actions[TGSI_OPCODE_DP2] = dot_action;
2282da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->op_actions[TGSI_OPCODE_DP3] = dot_action;
2292da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->op_actions[TGSI_OPCODE_DP4] = dot_action;
2302da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->op_actions[TGSI_OPCODE_DPH] = dot_action;
23195ed0e9b6b445c70e920d340818fc0f84d45233eVadim Girlin	bld_base->op_actions[TGSI_OPCODE_DDX].emit = llvm_emit_tex;
23295ed0e9b6b445c70e920d340818fc0f84d45233eVadim Girlin	bld_base->op_actions[TGSI_OPCODE_DDY].emit = llvm_emit_tex;
2332da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->op_actions[TGSI_OPCODE_TEX].emit = llvm_emit_tex;
2342da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->op_actions[TGSI_OPCODE_TXB].emit = llvm_emit_tex;
2352da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->op_actions[TGSI_OPCODE_TXD].emit = llvm_emit_tex;
2362da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->op_actions[TGSI_OPCODE_TXL].emit = llvm_emit_tex;
23795ed0e9b6b445c70e920d340818fc0f84d45233eVadim Girlin	bld_base->op_actions[TGSI_OPCODE_TXF].emit = llvm_emit_tex;
23895ed0e9b6b445c70e920d340818fc0f84d45233eVadim Girlin	bld_base->op_actions[TGSI_OPCODE_TXQ].emit = llvm_emit_tex;
2392da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->op_actions[TGSI_OPCODE_TXP].emit = llvm_emit_tex;
2402da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2412da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	lp_build_tgsi_llvm(bld_base, tokens);
2422da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2432da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	radeon_llvm_finalize_module(ctx);
2442da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2452da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	return ctx->gallivm.module;
2462da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard}
2472da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2482da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellardconst char * r600_llvm_gpu_string(enum radeon_family family)
2492da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard{
2502da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	const char * gpu_family;
2512da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2522da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	switch (family) {
2532da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_R600:
2542da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RV610:
2552da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RV630:
2562da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RV620:
2572da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RV635:
2582da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RS780:
2592da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RS880:
2602da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RV710:
2612da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "rv710";
2622da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
2632da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RV730:
2642da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "rv730";
2652da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
2662da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RV670:
2672da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RV740:
2682da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RV770:
2692da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "rv770";
2702da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
2712da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_PALM:
2722da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_CEDAR:
2732da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "cedar";
2742da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
2752da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_SUMO:
2762da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_SUMO2:
2772da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_REDWOOD:
2782da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "redwood";
2792da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
2802da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_JUNIPER:
2812da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "juniper";
2822da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
2832da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_HEMLOCK:
2842da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_CYPRESS:
2852da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "cypress";
2862da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
2872da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_BARTS:
2882da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "barts";
2892da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
2902da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_TURKS:
2912da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "turks";
2922da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
2932da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_CAICOS:
2942da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "caicos";
2952da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
2962da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_CAYMAN:
2972da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard        case CHIP_ARUBA:
2982da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "cayman";
2992da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
3002da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	default:
3012da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "";
3022da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		fprintf(stderr, "Chip not supported by r600 llvm "
3032da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard			"backend, please file a bug at bugs.freedesktop.org\n");
3042da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
3052da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	}
3062da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	return gpu_family;
3072da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard}
3082da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
3092da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellardunsigned r600_llvm_compile(
3102da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	LLVMModuleRef mod,
3112da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned char ** inst_bytes,
3122da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned * inst_byte_count,
3132da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	enum radeon_family family,
3142da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned dump)
3152da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard{
3162da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	const char * gpu_family = r600_llvm_gpu_string(family);
3172da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	return radeon_llvm_compile(mod, inst_bytes, inst_byte_count,
3182da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard							gpu_family, dump);
3192da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard}
320