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
194247fd9928b0301a300c0e1e14ed45560e0afc33Christian König#if defined R600_USE_LLVM || defined HAVE_OPENCL
204247fd9928b0301a300c0e1e14ed45560e0afc33Christian König
212da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellardstatic LLVMValueRef llvm_fetch_const(
222da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct lp_build_tgsi_context * bld_base,
232da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	const struct tgsi_full_src_register *reg,
242da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	enum tgsi_opcode_type type,
252da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned swizzle)
262da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard{
2712a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin	LLVMValueRef idx = lp_build_const_int32(bld_base->base.gallivm,
2812a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin			radeon_llvm_reg_index_soa(reg->Register.Index, swizzle));
2912a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin	LLVMValueRef cval = build_intrinsic(bld_base->base.gallivm->builder,
302da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		"llvm.AMDGPU.load.const", bld_base->base.elem_type,
3112a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin		&idx, 1, LLVMReadNoneAttribute);
322a88dfc521bff7255e27e2ef8efcd08f9db53747Vadim Girlin
332a88dfc521bff7255e27e2ef8efcd08f9db53747Vadim Girlin	return bitcast(bld_base, type, cval);
342da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard}
352da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
36d8a120485444968c930f0ab675473692b221cb75Vadim Girlinstatic void llvm_load_system_value(
37d8a120485444968c930f0ab675473692b221cb75Vadim Girlin		struct radeon_llvm_context * ctx,
38d8a120485444968c930f0ab675473692b221cb75Vadim Girlin		unsigned index,
39d8a120485444968c930f0ab675473692b221cb75Vadim Girlin		const struct tgsi_full_declaration *decl)
40d8a120485444968c930f0ab675473692b221cb75Vadim Girlin{
41d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	unsigned chan;
42d8a120485444968c930f0ab675473692b221cb75Vadim Girlin
43d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	switch (decl->Semantic.Name) {
44d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	case TGSI_SEMANTIC_INSTANCEID: chan = 3; break;
45d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	case TGSI_SEMANTIC_VERTEXID: chan = 0; break;
46d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	default: assert(!"unknown system value");
47d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	}
48d8a120485444968c930f0ab675473692b221cb75Vadim Girlin
49d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	LLVMValueRef reg = lp_build_const_int32(
50d8a120485444968c930f0ab675473692b221cb75Vadim Girlin			ctx->soa.bld_base.base.gallivm, chan);
5112a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin	ctx->system_values[index] = build_intrinsic(
52d8a120485444968c930f0ab675473692b221cb75Vadim Girlin			ctx->soa.bld_base.base.gallivm->builder,
53d8a120485444968c930f0ab675473692b221cb75Vadim Girlin			"llvm.R600.load.input",
5412a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin			ctx->soa.bld_base.base.elem_type, &reg, 1,
5512a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin			LLVMReadNoneAttribute);
56d8a120485444968c930f0ab675473692b221cb75Vadim Girlin}
57d8a120485444968c930f0ab675473692b221cb75Vadim Girlin
58d8a120485444968c930f0ab675473692b221cb75Vadim Girlinstatic LLVMValueRef llvm_fetch_system_value(
59d8a120485444968c930f0ab675473692b221cb75Vadim Girlin		struct lp_build_tgsi_context * bld_base,
60d8a120485444968c930f0ab675473692b221cb75Vadim Girlin		const struct tgsi_full_src_register *reg,
61d8a120485444968c930f0ab675473692b221cb75Vadim Girlin		enum tgsi_opcode_type type,
62d8a120485444968c930f0ab675473692b221cb75Vadim Girlin		unsigned swizzle)
63d8a120485444968c930f0ab675473692b221cb75Vadim Girlin{
64d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	struct radeon_llvm_context * ctx = radeon_llvm_context(bld_base);
65d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	LLVMValueRef cval = ctx->system_values[reg->Register.Index];
66d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	return bitcast(bld_base, type, cval);
67d8a120485444968c930f0ab675473692b221cb75Vadim Girlin}
68d8a120485444968c930f0ab675473692b221cb75Vadim Girlin
692da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellardstatic void llvm_load_input(
702da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct radeon_llvm_context * ctx,
712da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned input_index,
722da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	const struct tgsi_full_declaration *decl)
732da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard{
742da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned chan;
752da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
762da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	for (chan = 0; chan < 4; chan++) {
772da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		unsigned soa_index = radeon_llvm_reg_index_soa(input_index,
782da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard								chan);
792da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
802da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		/* The * 4 is assuming that we are in soa mode. */
812da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		LLVMValueRef reg = lp_build_const_int32(
822da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				ctx->soa.bld_base.base.gallivm,
832da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				soa_index + (ctx->reserved_reg_count * 4));
8412a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin		ctx->inputs[soa_index] = build_intrinsic(
852da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				ctx->soa.bld_base.base.gallivm->builder,
862da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				"llvm.R600.load.input",
8712a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin				ctx->soa.bld_base.base.elem_type, &reg, 1,
8812a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin				LLVMReadNoneAttribute);
892da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	}
902da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard}
912da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
922da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellardstatic void llvm_emit_prologue(struct lp_build_tgsi_context * bld_base)
932da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard{
942da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct radeon_llvm_context * ctx = radeon_llvm_context(bld_base);
952da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct lp_build_context * base = &bld_base->base;
962da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned i;
972da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
982da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	/* Reserve special input registers */
992da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	for (i = 0; i < ctx->reserved_reg_count; i++) {
1002da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		unsigned chan;
1012da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		for (chan = 0; chan < TGSI_NUM_CHANNELS; chan++) {
1022da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard			LLVMValueRef reg_index = lp_build_const_int32(
1032da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard					base->gallivm,
1042da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard					radeon_llvm_reg_index_soa(i, chan));
1052da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard			lp_build_intrinsic_unary(base->gallivm->builder,
1068a4c25dd7e9002ab7a2821753bcae1ff6af2ca1cTom Stellard				"llvm.AMDGPU.reserve.reg",
1072da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				LLVMVoidTypeInContext(base->gallivm->context),
1088a4c25dd7e9002ab7a2821753bcae1ff6af2ca1cTom Stellard				reg_index);
1092da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		}
1102da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	}
1112da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard}
1122da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
1132da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellardstatic void llvm_emit_epilogue(struct lp_build_tgsi_context * bld_base)
1142da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard{
1152da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct radeon_llvm_context * ctx = radeon_llvm_context(bld_base);
1162da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct lp_build_context * base = &bld_base->base;
1172da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned i;
1182da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
1192da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	/* Add the necessary export instructions */
1202da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	for (i = 0; i < ctx->output_reg_count; i++) {
1212da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		unsigned chan;
1222da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		for (chan = 0; chan < TGSI_NUM_CHANNELS; chan++) {
1232da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard			LLVMValueRef output;
1242da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard			unsigned adjusted_reg_idx = i +
1252da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard					ctx->reserved_reg_count;
1262da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard			LLVMValueRef reg_index = lp_build_const_int32(
1272da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				base->gallivm,
1282da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				radeon_llvm_reg_index_soa(adjusted_reg_idx, chan));
1292da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
1302da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard			output = LLVMBuildLoad(base->gallivm->builder,
1312da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				ctx->soa.outputs[i][chan], "");
1322da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
133a8d82c44f79e27d2b78458f9ea560c73eef3d3b5Tom Stellard			lp_build_intrinsic_binary(
1342da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				base->gallivm->builder,
1352da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				"llvm.AMDGPU.store.output",
1362da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard				LLVMVoidTypeInContext(base->gallivm->context),
137a8d82c44f79e27d2b78458f9ea560c73eef3d3b5Tom Stellard				output, reg_index);
1382da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		}
1392da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	}
1402da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard}
1412da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
1422da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellardstatic void llvm_emit_tex(
1432da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	const struct lp_build_tgsi_action * action,
1442da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct lp_build_tgsi_context * bld_base,
1452da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct lp_build_emit_data * emit_data)
1462da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard{
1472da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct gallivm_state * gallivm = bld_base->base.gallivm;
148fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin	LLVMValueRef args[6];
1497fa7c608cb3cb1105587eab793aaf4ff647a565bVadim Girlin	unsigned c, sampler_src;
1502da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
151fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin	assert(emit_data->arg_count + 2 <= Elements(args));
152fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin
153fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin	for (c = 0; c < emit_data->arg_count; ++c)
154fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin		args[c] = emit_data->args[c];
155fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin
1567fa7c608cb3cb1105587eab793aaf4ff647a565bVadim Girlin	sampler_src = emit_data->inst->Instruction.NumSrcRegs-1;
1577fa7c608cb3cb1105587eab793aaf4ff647a565bVadim Girlin
158fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin	args[c++] = lp_build_const_int32(gallivm,
1597fa7c608cb3cb1105587eab793aaf4ff647a565bVadim Girlin					emit_data->inst->Src[sampler_src].Register.Index);
160fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin	args[c++] = lp_build_const_int32(gallivm,
1612da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard					emit_data->inst->Texture.Texture);
162fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin
16312a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin	emit_data->output[0] = build_intrinsic(gallivm->builder,
1642da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard					action->intr_name,
165fa5a963dd6c2622c416d53e49b08c4b3cbce7483Vadim Girlin					emit_data->dst_type, args, c, LLVMReadNoneAttribute);
1662da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard}
1672da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
1682da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellardstatic void dp_fetch_args(
1692da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct lp_build_tgsi_context * bld_base,
1702da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct lp_build_emit_data * emit_data)
1712da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard{
1722da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct lp_build_context * base = &bld_base->base;
1732da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned chan;
1742da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	LLVMValueRef elements[2][4];
1752da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned opcode = emit_data->inst->Instruction.Opcode;
1762da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned dp_components = (opcode == TGSI_OPCODE_DP2 ? 2 :
1772da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard					(opcode == TGSI_OPCODE_DP3 ? 3 : 4));
1782da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	for (chan = 0 ; chan < dp_components; chan++) {
1792da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		elements[0][chan] = lp_build_emit_fetch(bld_base,
1802da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard						emit_data->inst, 0, chan);
1812da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		elements[1][chan] = lp_build_emit_fetch(bld_base,
1822da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard						emit_data->inst, 1, chan);
1832da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	}
1842da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
1852da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	for ( ; chan < 4; chan++) {
1862da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		elements[0][chan] = base->zero;
1872da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		elements[1][chan] = base->zero;
1882da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	}
1892da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
1902da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	 /* Fix up for DPH */
1912da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	if (opcode == TGSI_OPCODE_DPH) {
1922da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		elements[0][TGSI_CHAN_W] = base->one;
1932da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	}
1942da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
1952da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	emit_data->args[0] = lp_build_gather_values(bld_base->base.gallivm,
1962da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard							elements[0], 4);
1972da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	emit_data->args[1] = lp_build_gather_values(bld_base->base.gallivm,
1982da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard							elements[1], 4);
1992da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	emit_data->arg_count = 2;
2002da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2012da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	emit_data->dst_type = base->elem_type;
2022da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard}
2032da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2042da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellardstatic struct lp_build_tgsi_action dot_action = {
2052da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	.fetch_args = dp_fetch_args,
20612a2374da380a9a28cacf968c33b93ba320b0407Vadim Girlin	.emit = build_tgsi_intrinsic_nomem,
2072da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	.intr_name = "llvm.AMDGPU.dp4"
2082da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard};
2092da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2102da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2112da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2122da961056600d3f2d94a581c19bfcc1e636e8f41Tom StellardLLVMModuleRef r600_tgsi_llvm(
2132da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct radeon_llvm_context * ctx,
2142da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	const struct tgsi_token * tokens)
2152da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard{
2162da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct tgsi_shader_info shader_info;
2172da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	struct lp_build_tgsi_context * bld_base = &ctx->soa.bld_base;
2182da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	radeon_llvm_context_init(ctx);
2192da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	tgsi_scan_shader(tokens, &shader_info);
2202da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2212da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->info = &shader_info;
2222da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->userdata = ctx;
2232da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->emit_fetch_funcs[TGSI_FILE_CONSTANT] = llvm_fetch_const;
224d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	bld_base->emit_fetch_funcs[TGSI_FILE_SYSTEM_VALUE] = llvm_fetch_system_value;
2252da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->emit_prologue = llvm_emit_prologue;
2262da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->emit_epilogue = llvm_emit_epilogue;
2272da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	ctx->userdata = ctx;
2282da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	ctx->load_input = llvm_load_input;
229d8a120485444968c930f0ab675473692b221cb75Vadim Girlin	ctx->load_system_value = llvm_load_system_value;
2302da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2312da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->op_actions[TGSI_OPCODE_DP2] = dot_action;
2322da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->op_actions[TGSI_OPCODE_DP3] = dot_action;
2332da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->op_actions[TGSI_OPCODE_DP4] = dot_action;
2342da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->op_actions[TGSI_OPCODE_DPH] = dot_action;
23595ed0e9b6b445c70e920d340818fc0f84d45233eVadim Girlin	bld_base->op_actions[TGSI_OPCODE_DDX].emit = llvm_emit_tex;
23695ed0e9b6b445c70e920d340818fc0f84d45233eVadim Girlin	bld_base->op_actions[TGSI_OPCODE_DDY].emit = llvm_emit_tex;
2372da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->op_actions[TGSI_OPCODE_TEX].emit = llvm_emit_tex;
2382da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->op_actions[TGSI_OPCODE_TXB].emit = llvm_emit_tex;
2392da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->op_actions[TGSI_OPCODE_TXD].emit = llvm_emit_tex;
2402da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->op_actions[TGSI_OPCODE_TXL].emit = llvm_emit_tex;
24195ed0e9b6b445c70e920d340818fc0f84d45233eVadim Girlin	bld_base->op_actions[TGSI_OPCODE_TXF].emit = llvm_emit_tex;
24295ed0e9b6b445c70e920d340818fc0f84d45233eVadim Girlin	bld_base->op_actions[TGSI_OPCODE_TXQ].emit = llvm_emit_tex;
2432da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	bld_base->op_actions[TGSI_OPCODE_TXP].emit = llvm_emit_tex;
2442da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2452da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	lp_build_tgsi_llvm(bld_base, tokens);
2462da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2472da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	radeon_llvm_finalize_module(ctx);
2482da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2492da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	return ctx->gallivm.module;
2502da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard}
2512da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2522da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellardconst char * r600_llvm_gpu_string(enum radeon_family family)
2532da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard{
2542da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	const char * gpu_family;
2552da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
2562da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	switch (family) {
2572da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_R600:
2582da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RV610:
2592da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RV630:
2602da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RV620:
2612da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RV635:
2622da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RS780:
2632da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RS880:
2642da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RV710:
2652da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "rv710";
2662da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
2672da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RV730:
2682da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "rv730";
2692da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
2702da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RV670:
2712da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RV740:
2722da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_RV770:
2732da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "rv770";
2742da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
2752da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_PALM:
2762da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_CEDAR:
2772da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "cedar";
2782da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
2792da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_SUMO:
2802da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_SUMO2:
2812da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_REDWOOD:
2822da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "redwood";
2832da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
2842da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_JUNIPER:
2852da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "juniper";
2862da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
2872da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_HEMLOCK:
2882da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_CYPRESS:
2892da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "cypress";
2902da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
2912da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_BARTS:
2922da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "barts";
2932da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
2942da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_TURKS:
2952da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "turks";
2962da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
2972da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_CAICOS:
2982da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "caicos";
2992da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
3002da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	case CHIP_CAYMAN:
3012da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard        case CHIP_ARUBA:
3022da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "cayman";
3032da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
3042da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	default:
3052da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		gpu_family = "";
3062da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		fprintf(stderr, "Chip not supported by r600 llvm "
3072da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard			"backend, please file a bug at bugs.freedesktop.org\n");
3082da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard		break;
3092da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	}
3102da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	return gpu_family;
3112da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard}
3122da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard
3132da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellardunsigned r600_llvm_compile(
3142da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	LLVMModuleRef mod,
3152da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned char ** inst_bytes,
3162da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned * inst_byte_count,
3172da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	enum radeon_family family,
3182da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	unsigned dump)
3192da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard{
3202da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	const char * gpu_family = r600_llvm_gpu_string(family);
3212da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard	return radeon_llvm_compile(mod, inst_bytes, inst_byte_count,
3222da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard							gpu_family, dump);
3232da961056600d3f2d94a581c19bfcc1e636e8f41Tom Stellard}
3244247fd9928b0301a300c0e1e14ed45560e0afc33Christian König
3254247fd9928b0301a300c0e1e14ed45560e0afc33Christian König#endif
326