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