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, ®, 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, ®, 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