Lines Matching full:ctx
60 static int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader)
62 struct r600_context *rctx = (struct r600_context *)ctx;
70 pipe_buffer_create(ctx->screen, PIPE_BIND_CUSTOM, PIPE_USAGE_IMMUTABLE, rshader->bc.ndw * 4);
88 evergreen_pipe_shader_vs(ctx, shader);
90 r600_pipe_shader_vs(ctx, shader);
95 evergreen_pipe_shader_ps(ctx, shader);
97 r600_pipe_shader_ps(ctx, shader);
108 int r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader)
111 struct r600_context *rctx = (struct r600_context *)ctx;
153 return r600_pipe_shader(ctx, shader);
156 void r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader)
207 int (*process)(struct r600_shader_ctx *ctx);
211 static int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
212 static inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only);
213 static void fc_pushlevel(struct r600_shader_ctx *ctx, int type);
214 static int tgsi_else(struct r600_shader_ctx *ctx);
215 static int tgsi_endif(struct r600_shader_ctx *ctx);
216 static int tgsi_bgnloop(struct r600_shader_ctx *ctx);
217 static int tgsi_endloop(struct r600_shader_ctx *ctx);
218 static int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx);
227 static void r600_bytecode_from_byte_stream(struct r600_shader_ctx *ctx,
231 int r600_compute_shader_create(struct pipe_context * ctx,
234 struct r600_context *r600_ctx = (struct r600_context *)ctx;
291 static unsigned r600_alu_from_byte_stream(struct r600_shader_ctx *ctx,
336 r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
338 r600_bytecode_add_alu(ctx->bc, &alu);
343 ctx->shader->uses_kill = 1;
345 ctx->bc->force_add_cf = 1;
350 static void llvm_if(struct r600_shader_ctx *ctx, struct r600_bytecode_alu * alu,
353 r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
354 fc_pushlevel(ctx, FC_IF);
355 callstack_check_depth(ctx, FC_PUSH_VPM, 0);
358 static void r600_break_from_byte_stream(struct r600_shader_ctx *ctx,
362 if (ctx->bc->chip_class == CAYMAN)
363 ctx->inst_info = &cm_shader_tgsi_instruction[opcode];
364 else if (ctx->bc->chip_class >= EVERGREEN)
365 ctx->inst_info = &eg_shader_tgsi_instruction[opcode];
367 ctx->inst_info = &r600_shader_tgsi_instruction[opcode];
368 llvm_if(ctx, alu, compare_opcode);
369 tgsi_loop_brk_cont(ctx);
370 tgsi_endif(ctx);
373 static unsigned r600_fc_from_byte_stream(struct r600_shader_ctx *ctx,
383 llvm_if(ctx, &alu,
387 llvm_if(ctx, &alu,
391 tgsi_else(ctx);
394 tgsi_endif(ctx);
397 tgsi_bgnloop(ctx);
400 tgsi_endloop(ctx);
403 r600_break_from_byte_stream(ctx, &alu,
407 r600_break_from_byte_stream(ctx, &alu,
413 if (ctx->bc->chip_class == CAYMAN) {
414 ctx->inst_info =
416 } else if (ctx->bc->chip_class >= EVERGREEN) {
417 ctx->inst_info =
420 ctx->inst_info =
423 tgsi_loop_brk_cont(ctx);
427 r600_break_from_byte_stream(ctx, &alu,
431 r600_break_from_byte_stream(ctx, &alu,
439 static unsigned r600_tex_from_byte_stream(struct r600_shader_ctx *ctx,
468 r600_bytecode_add_tex(ctx->bc, &tex);
473 static int r600_vtx_from_byte_stream(struct r600_shader_ctx *ctx,
508 if (r600_bytecode_add_vtx(ctx->bc, &vtx)) {
512 ctx->bc->cf_last->inst = EG_V_SQ_CF_WORD1_SQ_CF_INST_TEX;
516 static void r600_bytecode_from_byte_stream(struct r600_shader_ctx *ctx,
525 bytes_read = r600_alu_from_byte_stream(ctx, bytes,
529 bytes_read = r600_tex_from_byte_stream(ctx, bytes,
533 bytes_read = r600_fc_from_byte_stream(ctx, bytes,
537 r600_bytecode_add_cfinst(ctx->bc, CF_NATIVE);
540 ctx->bc->cf_last->isa[i] |=
547 bytes_read = r600_vtx_from_byte_stream(ctx, bytes,
559 static int tgsi_is_supported(struct r600_shader_ctx *ctx)
561 struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
594 static int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
601 if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
603 if (ctx->shader->input[input].centroid)
605 } else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
608 if (ctx->input_perspective) {
611 if (ctx->input_centroid)
614 if (ctx->shader->input[input].centroid)
631 alu.dst.sel = ctx->shader->input[input].gpr;
640 alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
645 r = r600_bytecode_add_alu(ctx->bc, &alu);
652 static int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input)
662 alu.dst.sel = ctx->shader->input[input].gpr;
667 alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
672 r = r600_bytecode_add_alu(ctx->bc, &alu);
744 static int evergreen_interp_input(struct r600_shader_ctx *ctx, int index)
748 if (ctx->shader->input[index].spi_sid) {
749 ctx->shader->input[index].lds_pos = ctx->shader->nlds++;
750 if (ctx->shader->input[index].interpolate > 0) {
751 r = evergreen_interp_alu(ctx, index);
753 r = evergreen_interp_flat(ctx, index);
759 static int select_twoside_color(struct r600_shader_ctx *ctx, int front, int back)
763 int gpr_front = ctx->shader->input[front].gpr;
764 int gpr_back = ctx->shader->input[back].gpr;
772 alu.src[0].sel = ctx->face_gpr;
781 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
788 static int tgsi_declaration(struct r600_shader_ctx *ctx)
790 struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
796 i = ctx->shader->ninput++;
797 ctx->shader->input[i].name = d->Semantic.Name;
798 ctx->shader->input[i].sid = d->Semantic.Index;
799 ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]);
800 ctx->shader->input[i].interpolate = d->Interp.Interpolate;
801 ctx->shader->input[i].centroid = d->Interp.Centroid;
802 ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First;
803 if (ctx->type == TGSI_PROCESSOR_FRAGMENT) {
804 switch (ctx->shader->input[i].name) {
806 ctx->face_gpr = ctx->shader->input[i].gpr;
809 ctx->colors_used++;
812 ctx->fragcoord_input = i;
815 if (ctx->bc->chip_class >= EVERGREEN) {
816 if ((r = evergreen_interp_input(ctx, i)))
822 i = ctx->shader->noutput++;
823 ctx->shader->output[i].name = d->Semantic.Name;
824 ctx->shader->output[i].sid = d->Semantic.Index;
825 ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]);
826 ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First;
827 ctx->shader->output[i].interpolate = d->Interp.Interpolate;
828 ctx->shader->output[i].write_mask = d->Declaration.UsageMask;
829 if (ctx->type == TGSI_PROCESSOR_VERTEX) {
832 ctx->shader->clip_dist_write |= d->Declaration.UsageMask << (d->Semantic.Index << 2);
835 ctx->shader->vs_out_misc_write = 1;
836 ctx->shader->vs_out_point_size = 1;
839 ctx->clip_vertex_write = TRUE;
840 ctx->cv_output = i;
843 } else if (ctx->type == TGSI_PROCESSOR_FRAGMENT) {
846 ctx->shader->nr_ps_max_color_exports++;
859 if (!ctx->native_integers) {
872 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
885 static int r600_get_temp(struct r600_shader_ctx *ctx)
887 return ctx->temp_reg + ctx->max_driver_temp_used++;
898 static int evergreen_gpr_count(struct r600_shader_ctx *ctx)
903 ctx->input_linear = FALSE;
904 ctx->input_perspective = FALSE;
905 ctx->input_centroid = FALSE;
906 ctx->num_interp_gpr = 1;
909 for (i = 0; i < ctx->info.num_inputs; i++) {
911 if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
912 ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
914 if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
915 ctx->input_linear = TRUE;
916 if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
917 ctx->input_perspective = TRUE;
918 if (ctx->info.input_centroid[i])
919 ctx->input_centroid = TRUE;
924 if (ctx->input_perspective)
926 if (ctx->input_linear)
928 if (ctx->input_centroid)
931 ctx->num_interp_gpr += (num_baryc + 1) >> 1;
934 return ctx->num_interp_gpr;
937 static void tgsi_src(struct r600_shader_ctx *ctx,
956 r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg);
962 memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value));
964 if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) {
970 } else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_VERTEXID) {
981 r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
985 static int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg)
997 alu.src[0].sel = ctx->bc->ar_reg;
1006 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
1011 ar_reg = ctx->bc->ar_reg;
1029 if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx)))
1035 static int tgsi_split_constant(struct r600_shader_ctx *ctx)
1037 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1045 tgsi_src(ctx, &inst->Src[i], &ctx->src[i]);
1052 if (ctx->src[i].rel) {
1053 int treg = r600_get_temp(ctx);
1054 if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg)))
1057 ctx->src[i].sel = treg;
1058 ctx->src[i].rel = 0;
1061 int treg = r600_get_temp(ctx);
1065 alu.src[0].sel = ctx->src[i].sel;
1067 alu.src[0].rel = ctx->src[i].rel;
1073 r = r600_bytecode_add_alu(ctx->bc, &alu);
1077 ctx->src[i].sel = treg;
1078 ctx->src[i].rel =0;
1086 static int tgsi_split_literal_constant(struct r600_shader_ctx *ctx)
1088 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1093 if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
1098 if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
1099 int treg = r600_get_temp(ctx);
1103 alu.src[0].sel = ctx->src[i].sel;
1105 alu.src[0].value = ctx->src[i].value[k];
1111 r = r600_bytecode_add_alu(ctx->bc, &alu);
1115 ctx->src[i].sel = treg;
1122 static int process_twoside_color_inputs(struct r600_shader_ctx *ctx)
1124 int i, r, count = ctx->shader->ninput;
1130 int gpr = ctx->file_offset[TGSI_FILE_INPUT] +
1131 ctx->info.file_max[TGSI_FILE_INPUT] + 1;
1133 if (ctx->face_gpr == -1) {
1134 i = ctx->shader->ninput++;
1135 ctx->shader->input[i].name = TGSI_SEMANTIC_FACE;
1136 ctx->shader->input[i].spi_sid = 0;
1137 ctx->shader->input[i].gpr = gpr++;
1138 ctx->face_gpr = ctx->shader->input[i].gpr;
1142 if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) {
1143 int ni = ctx->shader->ninput++;
1144 memcpy(&ctx->shader->input[ni],&ctx->shader->input[i], sizeof(struct r600_shader_io));
1145 ctx->shader->input[ni].name = TGSI_SEMANTIC_BCOLOR;
1146 ctx->shader->input[ni].spi_sid = r600_spi_sid(&ctx->shader->input[ni]);
1147 ctx->shader->input[ni].gpr = gpr++;
1149 if (ctx->bc->chip_class >= EVERGREEN) {
1150 r = evergreen_interp_input(ctx, ni);
1155 r = select_twoside_color(ctx, i, ni);
1170 struct r600_shader_ctx ctx;
1184 ctx.bc = &shader->bc;
1185 ctx.shader = shader;
1186 ctx.native_integers = true;
1188 r600_bytecode_init(ctx.bc, rctx->chip_class, rctx->family);
1189 ctx.tokens = tokens;
1190 tgsi_scan_shader(tokens, &ctx.info);
1191 tgsi_parse_init(&ctx.parse, tokens);
1192 ctx.type = ctx.parse.FullHeader.Processor.Processor;
1193 shader->processor_type = ctx.type;
1194 ctx.bc->type = shader->processor_type;
1196 ctx.face_gpr = -1;
1197 ctx.fragcoord_input = -1;
1198 ctx.colors_used = 0;
1199 ctx.clip_vertex_write = 0;
1204 shader->two_side = (ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->two_side;
1228 ctx.file_offset[i] = 0;
1230 if (ctx.type == TGSI_PROCESSOR_VERTEX) {
1231 ctx.file_offset[TGSI_FILE_INPUT] = 1;
1232 if (ctx.bc->chip_class >= EVERGREEN) {
1233 r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
1235 r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
1238 if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) {
1239 ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
1244 if (use_llvm && ctx.info.indirect_files) {
1255 radeon_llvm_ctx.reserved_reg_count = ctx.file_offset[TGSI_FILE_INPUT];
1268 ctx.file_offset[TGSI_FILE_OUTPUT] =
1269 ctx.file_offset[TGSI_FILE_INPUT];
1277 ctx.file_offset[TGSI_FILE_OUTPUT] =
1278 ctx.file_offset[TGSI_FILE_INPUT] +
1279 ctx.info.file_max[TGSI_FILE_INPUT] + 1;
1281 ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
1282 ctx.info.file_max[TGSI_FILE_OUTPUT] + 1;
1286 ctx.file_offset[TGSI_FILE_CONSTANT] = 512;
1288 ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL;
1289 ctx.bc->ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
1290 ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1;
1291 ctx.temp_reg = ctx.bc->ar_reg + 1;
1293 ctx.nliterals = 0;
1294 ctx.literals = NULL;
1296 while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
1297 tgsi_parse_token(&ctx.parse);
1298 switch (ctx.parse.FullToken.Token.Type) {
1300 immediate = &ctx.parse.FullToken.FullImmediate;
1301 ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
1302 if(ctx.literals == NULL) {
1306 ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
1307 ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
1308 ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
1309 ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
1310 ctx.nliterals++;
1313 r = tgsi_declaration(&ctx);
1320 property = &ctx.parse.FullToken.FullProperty;
1333 R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
1342 if (ctx.fragcoord_input >= 0) {
1343 if (ctx.bc->chip_class == CAYMAN) {
1347 alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1348 alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr;
1351 alu.dst.sel = shader->input[ctx.fragcoord_input].gpr;
1355 if ((r = r600_bytecode_add_alu(ctx.bc, &alu)))
1361 alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1362 alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr;
1365 alu.dst.sel = shader->input[ctx.fragcoord_input].gpr;
1369 if ((r = r600_bytecode_add_alu(ctx.bc, &alu)))
1374 if (shader->two_side && ctx.colors_used) {
1375 if ((r = process_twoside_color_inputs(&ctx)))
1379 tgsi_parse_init(&ctx.parse, tokens);
1380 while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
1381 tgsi_parse_token(&ctx.parse);
1382 switch (ctx.parse.FullToken.Token.Type) {
1387 r = tgsi_is_supported(&ctx);
1390 ctx.max_driver_temp_used = 0;
1392 r600_get_temp(&ctx);
1394 opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
1395 if ((r = tgsi_split_constant(&ctx)))
1397 if ((r = tgsi_split_literal_constant(&ctx)))
1399 if (ctx.bc->chip_class == CAYMAN)
1400 ctx.inst_info = &cm_shader_tgsi_instruction[opcode];
1401 else if (ctx.bc->chip_class >= EVERGREEN)
1402 ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
1404 ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
1405 r = ctx.inst_info->process(&ctx);
1416 r600_bytecode_from_byte_stream(&ctx, inst_bytes, inst_byte_count);
1422 if (ctx.clip_vertex_write) {
1428 shader->output[noutput].gpr = ctx.temp_reg;
1431 shader->output[noutput].gpr = ctx.temp_reg+1;
1435 shader->output[ctx.cv_output].spi_sid = 0;
1446 alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4);
1447 alu.src[0].sel = shader->output[ctx.cv_output].gpr;
1454 alu.dst.sel = ctx.temp_reg + oreg;
1459 r = r600_bytecode_add_alu(ctx.bc, &alu);
1467 if (ctx.type == TGSI_PROCESSOR_VERTEX && so.num_outputs) {
1494 if (ctx.bc->chip_class >= EVERGREEN) {
1525 r = r600_bytecode_add_output(ctx.bc, &output);
1543 output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1544 switch (ctx.type) {
1604 output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1628 R600_ERR("unsupported processor type %d\n", ctx.type);
1640 if (ctx.type == TGSI_PROCESSOR_VERTEX && next_param_base == 0) {
1652 output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1657 if (ctx.type == TGSI_PROCESSOR_FRAGMENT && next_pixel_base == 0) {
1669 output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1677 if (ctx.bc->chip_class < CAYMAN) {
1684 output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
1689 r = r600_bytecode_add_output(ctx.bc, &output[i]);
1694 if (ctx.bc->chip_class == CAYMAN)
1695 cm_bytecode_add_cf_end(ctx.bc);
1699 if (ctx.bc->ngpr > 124) {
1700 R600_ERR("GPR limit exceeded - shader requires %d registers\n", ctx.bc->ngpr);
1705 free(ctx.literals);
1706 tgsi_parse_free(&ctx.parse);
1709 free(ctx.literals);
1710 tgsi_parse_free(&ctx.parse);
1714 static int tgsi_unsupported(struct r600_shader_ctx *ctx)
1717 tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode));
1721 static int tgsi_end(struct r600_shader_ctx *ctx)
1749 static void tgsi_dst(struct r600_shader_ctx *ctx,
1754 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1757 r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
1779 static int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only)
1781 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1791 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1793 alu.inst = ctx->inst_info->r600_opcode;
1796 r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1799 r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
1800 r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1803 switch (ctx->inst_info->tgsi_opcode) {
1816 r = r600_bytecode_add_alu(ctx->bc, &alu);
1823 static int tgsi_op2(struct r600_shader_ctx *ctx)
1825 return tgsi_op2_s(ctx, 0, 0);
1828 static int tgsi_op2_swap(struct r600_shader_ctx *ctx)
1830 return tgsi_op2_s(ctx, 1, 0);
1833 static int tgsi_op2_trans(struct r600_shader_ctx *ctx)
1835 return tgsi_op2_s(ctx, 0, 1);
1838 static int tgsi_ineg(struct r600_shader_ctx *ctx)
1840 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1850 alu.inst = ctx->inst_info->r600_opcode;
1854 r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1856 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1861 r = r600_bytecode_add_alu(ctx->bc, &alu);
1869 static int cayman_emit_float_instr(struct r600_shader_ctx *ctx)
1871 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1878 alu.inst = ctx->inst_info->r600_opcode;
1880 r600_bytecode_src(&alu.src[j], &ctx->src[j], 0);
1883 if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_RSQ) {
1887 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1892 r = r600_bytecode_add_alu(ctx->bc, &alu);
1899 static int cayman_mul_int_instr(struct r600_shader_ctx *ctx)
1901 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1911 alu.inst = ctx->inst_info->r600_opcode;
1913 r600_bytecode_src(&alu.src[j], &ctx->src[j], k);
1915 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1919 r = r600_bytecode_add_alu(ctx->bc, &alu);
1932 static int tgsi_setup_trig(struct r600_shader_ctx *ctx)
1946 alu.dst.sel = ctx->temp_reg;
1949 r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
1957 r = r600_bytecode_add_alu(ctx->bc, &alu);
1965 alu.dst.sel = ctx->temp_reg;
1968 alu.src[0].sel = ctx->temp_reg;
1971 r = r600_bytecode_add_alu(ctx->bc, &alu);
1980 alu.dst.sel = ctx->temp_reg;
1983 alu.src[0].sel = ctx->temp_reg;
1991 if (ctx->bc->chip_class == R600) {
2001 r = r600_bytecode_add_alu(ctx->bc, &alu);
2007 static int cayman_trig(struct r600_shader_ctx *ctx)
2009 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2014 r = tgsi_setup_trig(ctx);
2021 alu.inst = ctx->inst_info->r600_opcode;
2024 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2027 alu.src[0].sel = ctx->temp_reg;
2031 r = r600_bytecode_add_alu(ctx->bc, &alu);
2038 static int tgsi_trig(struct r600_shader_ctx *ctx)
2040 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2045 r = tgsi_setup_trig(ctx);
2050 alu.inst = ctx->inst_info->r600_opcode;
2052 alu.dst.sel = ctx->temp_reg;
2055 alu.src[0].sel = ctx->temp_reg;
2058 r = r600_bytecode_add_alu(ctx->bc, &alu);
2070 alu.src[0].sel = ctx->temp_reg;
2071 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2074 r = r600_bytecode_add_alu(ctx->bc, &alu);
2081 static int tgsi_scs(struct r600_shader_ctx *ctx)
2083 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2091 r = tgsi_setup_trig(ctx);
2098 if (ctx->bc->chip_class == CAYMAN) {
2102 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2108 alu.src[0].sel = ctx->temp_reg;
2112 r = r600_bytecode_add_alu(ctx->bc, &alu);
2119 tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
2121 alu.src[0].sel = ctx->temp_reg;
2124 r = r600_bytecode_add_alu(ctx->bc, &alu);
2132 if (ctx->bc->chip_class == CAYMAN) {
2136 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2141 alu.src[0].sel = ctx->temp_reg;
2145 r = r600_bytecode_add_alu(ctx->bc, &alu);
2152 tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
2154 alu.src[0].sel = ctx->temp_reg;
2157 r = r600_bytecode_add_alu(ctx->bc, &alu);
2169 tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
2176 r = r600_bytecode_add_alu(ctx->bc, &alu);
2187 tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
2194 r = r600_bytecode_add_alu(ctx->bc, &alu);
2202 static int tgsi_kill(struct r600_shader_ctx *ctx)
2209 alu.inst = ctx->inst_info->r600_opcode;
2215 if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
2219 r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
2224 r = r600_bytecode_add_alu(ctx->bc, &alu);
2230 ctx->bc->force_add_cf = 1;
2231 ctx->shader->uses_kill = TRUE;
2235 static int tgsi_lit(struct r600_shader_ctx *ctx)
2237 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2244 r600_bytecode_src(&alu.src[0], &ctx->src[0], 1);
2248 alu.dst.sel = ctx->temp_reg;
2253 r = r600_bytecode_add_alu(ctx->bc, &alu);
2263 if (ctx->bc->chip_class == CAYMAN) {
2268 alu.src[0].sel = ctx->temp_reg;
2270 alu.dst.sel = ctx->temp_reg;
2278 r = r600_bytecode_add_alu(ctx->bc, &alu);
2286 alu.src[0].sel = ctx->temp_reg;
2288 alu.dst.sel = ctx->temp_reg;
2292 r = r600_bytecode_add_alu(ctx->bc, &alu);
2305 r600_bytecode_src(&alu.src[1], &ctx->src[0], 3);
2306 r600_bytecode_src(&alu.src[2], &ctx->src[0], 0);
2307 alu.dst.sel = ctx->temp_reg;
2312 r = r600_bytecode_add_alu(ctx->bc, &alu);
2316 if (ctx->bc->chip_class == CAYMAN) {
2321 alu.src[0].sel = ctx->temp_reg;
2323 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2329 r = r600_bytecode_add_alu(ctx->bc, &alu);
2337 alu.src[0].sel = ctx->temp_reg;
2339 tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
2341 r = r600_bytecode_add_alu(ctx->bc, &alu);
2352 tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
2354 r = r600_bytecode_add_alu(ctx->bc, &alu);
2361 r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2364 tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
2366 r = r600_bytecode_add_alu(ctx->bc, &alu);
2375 tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
2378 r = r600_bytecode_add_alu(ctx->bc, &alu);
2385 static int tgsi_rsq(struct r600_shader_ctx *ctx)
2387 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2400 r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
2403 alu.dst.sel = ctx->temp_reg;
2406 r = r600_bytecode_add_alu(ctx->bc, &alu);
2410 return tgsi_helper_tempx_replicate(ctx);
2413 static int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
2415 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2421 alu.src[0].sel = ctx->temp_reg;
2424 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2428 r = r600_bytecode_add_alu(ctx->bc, &alu);
2435 static int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
2437 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2442 alu.inst = ctx->inst_info->r600_opcode;
2444 r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
2446 alu.dst.sel = ctx->temp_reg;
2449 r = r600_bytecode_add_alu(ctx->bc, &alu);
2453 return tgsi_helper_tempx_replicate(ctx);
2456 static int cayman_pow(struct r600_shader_ctx *ctx)
2458 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2466 r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2467 alu.dst.sel = ctx->temp_reg;
2472 r = r600_bytecode_add_alu(ctx->bc, &alu);
2480 r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
2481 alu.src[1].sel = ctx->temp_reg;
2482 alu.dst.sel = ctx->temp_reg;
2485 r = r600_bytecode_add_alu(ctx->bc, &alu);
2493 alu.src[0].sel = ctx->temp_reg;
2495 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2499 r = r600_bytecode_add_alu(ctx->bc, &alu);
2506 static int tgsi_pow(struct r600_shader_ctx *ctx)
2514 r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2515 alu.dst.sel = ctx->temp_reg;
2518 r = r600_bytecode_add_alu(ctx->bc, &alu);
2524 r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
2525 alu.src[1].sel = ctx->temp_reg;
2526 alu.dst.sel = ctx->temp_reg;
2529 r = r600_bytecode_add_alu(ctx->bc, &alu);
2535 alu.src[0].sel = ctx->temp_reg;
2536 alu.dst.sel = ctx->temp_reg;
2539 r = r600_bytecode_add_alu(ctx->bc, &alu);
2542 return tgsi_helper_tempx_replicate(ctx);
2545 static int tgsi_divmod(struct r600_shader_ctx *ctx, int mod, int signed_op)
2547 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2551 int tmp0 = ctx->temp_reg;
2552 int tmp1 = r600_get_temp(ctx);
2553 int tmp2 = r600_get_temp(ctx);
2554 int tmp3 = r600_get_temp(ctx);
2617 r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
2620 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2633 r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2636 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2650 r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
2651 r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2654 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2667 r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
2668 r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
2673 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2685 r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
2686 r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2691 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2697 if (ctx->bc->chip_class == CAYMAN) {
2710 r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
2714 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2731 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2747 r = r600_bytecode_add_alu(ctx->bc, &alu);
2762 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2777 r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
2781 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2786 if (ctx->bc->chip_class == CAYMAN) {
2801 r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2805 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2822 r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2826 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2843 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2847 if (ctx->bc->chip_class == CAYMAN) {
2863 r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2866 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2884 ctx->src[1], i);
2888 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2909 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2913 if (ctx->bc->chip_class == CAYMAN) {
2929 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2947 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2965 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2982 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3002 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3006 if (ctx->bc->chip_class == CAYMAN) {
3022 r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3026 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3044 r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3048 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3053 if (ctx->bc->chip_class == CAYMAN) {
3066 r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
3073 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3088 r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
3095 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3111 r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3118 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3135 r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
3139 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3154 r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3161 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3181 r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
3185 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3202 r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
3206 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3224 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3240 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3259 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3280 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3293 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3304 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3326 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3335 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3337 r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3344 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3362 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3371 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3381 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3389 static int tgsi_udiv(struct r600_shader_ctx *ctx)
3391 return tgsi_divmod(ctx, 0, 0);
3394 static int tgsi_umod(struct r600_shader_ctx *ctx)
3396 return tgsi_divmod(ctx, 1, 0);
3399 static int tgsi_idiv(struct r600_shader_ctx *ctx)
3401 return tgsi_divmod(ctx, 0, 1);
3404 static int tgsi_imod(struct r600_shader_ctx *ctx)
3406 return tgsi_divmod(ctx, 1, 1);
3410 static int tgsi_f2i(struct r600_shader_ctx *ctx)
3412 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3425 alu.dst.sel = ctx->temp_reg;
3429 r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3432 r = r600_bytecode_add_alu(ctx->bc, &alu);
3442 alu.inst = ctx->inst_info->r600_opcode;
3444 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3446 alu.src[0].sel = ctx->temp_reg;
3451 r = r600_bytecode_add_alu(ctx->bc, &alu);
3459 static int tgsi_iabs(struct r600_shader_ctx *ctx)
3461 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3475 alu.dst.sel = ctx->temp_reg;
3479 r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3484 r = r600_bytecode_add_alu(ctx->bc, &alu);
3499 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3501 r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3502 r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3503 alu.src[2].sel = ctx->temp_reg;
3508 r = r600_bytecode_add_alu(ctx->bc, &alu);
3515 static int tgsi_issg(struct r600_shader_ctx *ctx)
3517 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3532 alu.dst.sel = ctx->temp_reg;
3536 r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3537 r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3542 r = r600_bytecode_add_alu(ctx->bc, &alu);
3557 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3559 alu.src[0].sel = ctx->temp_reg;
3564 alu.src[2].sel = ctx->temp_reg;
3569 r = r600_bytecode_add_alu(ctx->bc, &alu);
3578 static int tgsi_ssg(struct r600_shader_ctx *ctx)
3580 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3590 alu.dst.sel = ctx->temp_reg;
3593 r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3595 r600_bytecode_src(&alu.src[2], &ctx->src[0], i);
3599 r = r600_bytecode_add_alu(ctx->bc, &alu);
3609 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3611 alu.src[0].sel = ctx->temp_reg;
3618 alu.src[2].sel = ctx->temp_reg;
3623 r = r600_bytecode_add_alu(ctx->bc, &alu);
3630 static int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
3642 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3643 alu.src[0].sel = ctx->temp_reg;
3649 r = r600_bytecode_add_alu(ctx->bc, &alu);
3656 static int tgsi_op3(struct r600_shader_ctx *ctx)
3658 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3668 alu.inst = ctx->inst_info->r600_opcode;
3670 r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3673 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3680 r = r600_bytecode_add_alu(ctx->bc, &alu);
3687 static int tgsi_dp(struct r600_shader_ctx *ctx)
3689 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3695 alu.inst = ctx->inst_info->r600_opcode;
3697 r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3700 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3704 switch (ctx->inst_info->tgsi_opcode) {
3730 r = r600_bytecode_add_alu(ctx->bc, &alu);
3737 static inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx,
3740 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3744 ctx->src[index].neg || ctx->src[index].abs;
3747 static inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx,
3750 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3751 return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index;
3754 static int tgsi_tex(struct r600_shader_ctx *ctx)
3757 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3766 tgsi_tex_src_requires_loading(ctx, 0);
3771 src_gpr = tgsi_tex_get_src_gpr(ctx, 0);
3778 offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1;
3779 offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1;
3780 offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1;
3791 tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
3794 if (tgsi_tex_src_requires_loading(ctx, i)) {
3795 tex.src_gpr = r600_get_temp(ctx);
3804 r600_bytecode_src(&alu.src[0], &ctx->src[i], j);
3810 r = r600_bytecode_add_alu(ctx->bc, &alu);
3816 tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i);
3817 tex.src_sel_x = ctx->src[i].swizzle[0];
3818 tex.src_sel_y = ctx->src[i].swizzle[1];
3819 tex.src_sel_z = ctx->src[i].swizzle[2];
3820 tex.src_sel_w = ctx->src[i].swizzle[3];
3821 tex.src_rel = ctx->src[i].rel;
3823 tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */
3831 r = r600_bytecode_add_tex(ctx->bc, &tex);
3838 if (ctx->bc->chip_class == CAYMAN) {
3843 r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
3845 alu.dst.sel = ctx->temp_reg;
3851 r = r600_bytecode_add_alu(ctx->bc, &alu);
3860 r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
3862 alu.dst.sel = ctx->temp_reg;
3866 r = r600_bytecode_add_alu(ctx->bc, &alu);
3874 alu.src[0].sel = ctx->temp_reg;
3876 r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3877 alu.dst.sel = ctx->temp_reg;
3880 r = r600_bytecode_add_alu(ctx->bc, &alu);
3888 alu.dst.sel = ctx->temp_reg;
3892 r = r600_bytecode_add_alu(ctx->bc, &alu);
3896 src_gpr = ctx->temp_reg;
3911 r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
3912 r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]);
3913 alu.dst.sel = ctx->temp_reg;
3918 r = r600_bytecode_add_alu(ctx->bc, &alu);
3924 if (ctx->bc->chip_class == CAYMAN) {
3928 alu.src[0].sel = ctx->temp_reg;
3931 alu.dst.sel = ctx->temp_reg;
3937 r = r600_bytecode_add_alu(ctx->bc, &alu);
3944 alu.src[0].sel = ctx->temp_reg;
3947 alu.dst.sel = ctx->temp_reg;
3951 r = r600_bytecode_add_alu(ctx->bc, &alu);
3964 alu.src[0].sel = ctx->temp_reg;
3966 alu.src[1].sel = ctx->temp_reg;
3973 alu.dst.sel = ctx->temp_reg;
3977 r = r600_bytecode_add_alu(ctx->bc, &alu);
3985 alu.src[0].sel = ctx->temp_reg;
3987 alu.src[1].sel = ctx->temp_reg;
3994 alu.dst.sel = ctx->temp_reg;
3999 r = r600_bytecode_add_alu(ctx->bc, &alu);
4006 r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
4007 alu.dst.sel = ctx->temp_reg;
4011 r = r600_bytecode_add_alu(ctx->bc, &alu);
4022 r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
4023 alu.dst.sel = ctx->temp_reg;
4027 r = r600_bytecode_add_alu(ctx->bc, &alu);
4033 src_gpr = ctx->temp_reg;
4040 r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
4041 alu.dst.sel = ctx->temp_reg;
4046 r = r600_bytecode_add_alu(ctx->bc, &alu);
4051 src_gpr = ctx->temp_reg;
4054 opcode = ctx->inst_info->r600_opcode;
4080 tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
4083 tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
4100 tex.src_sel_x = ctx->src[0].swizzle[0];
4101 tex.src_sel_y = ctx->src[0].swizzle[1];
4102 tex.src_sel_z = ctx->src[0].swizzle[2];
4103 tex.src_sel_w = ctx->src[0].swizzle[3];
4104 tex.src_rel = ctx->src[0].rel;
4155 r = r600_bytecode_add_tex(ctx->bc, &tex);
4163 static int tgsi_lrp(struct r600_shader_ctx *ctx)
4165 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
4172 if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) {
4179 r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
4180 r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4182 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4187 r = r600_bytecode_add_alu(ctx->bc, &alu);
4203 r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
4205 alu.dst.sel = ctx->temp_reg;
4211 r = r600_bytecode_add_alu(ctx->bc, &alu);
4223 alu.src[0].sel = ctx->temp_reg;
4225 r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4226 alu.dst.sel = ctx->temp_reg;
4232 r = r600_bytecode_add_alu(ctx->bc, &alu);
4245 r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
4246 r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
4247 alu.src[2].sel = ctx->temp_reg;
4250 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4255 r = r600_bytecode_add_alu(ctx->bc, &alu);
4262 static int tgsi_cmp(struct r600_shader_ctx *ctx)
4264 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
4275 r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
4276 r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4277 r600_bytecode_src(&alu.src[2], &ctx->src[1], i);
4278 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4284 r = r600_bytecode_add_alu(ctx->bc, &alu);
4291 static int tgsi_xpd(struct r600_shader_ctx *ctx)
4293 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
4307 r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
4308 r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]);
4316 alu.dst.sel = ctx->temp_reg;
4322 r = r600_bytecode_add_alu(ctx->bc, &alu);
4332 r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]);
4333 r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]);
4341 alu.src[2].sel = ctx->temp_reg;
4346 alu.dst.sel = ctx->temp_reg;
4348 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4354 r = r600_bytecode_add_alu(ctx->bc, &alu);
4359 return tgsi_helper_copy(ctx, inst);
4363 static int tgsi_exp(struct r600_shader_ctx *ctx)
4365 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
4375 r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4377 alu.dst.sel = ctx->temp_reg;
4381 r = r600_bytecode_add_alu(ctx->bc, &alu);
4385 if (ctx->bc->chip_class == CAYMAN) {
4388 alu.src[0].sel = ctx->temp_reg;
4391 alu.dst.sel = ctx->temp_reg;
4395 r = r600_bytecode_add_alu(ctx->bc, &alu);
4401 alu.src[0].sel = ctx->temp_reg;
4404 alu.dst.sel = ctx->temp_reg;
4408 r = r600_bytecode_add_alu(ctx->bc, &alu);
4419 r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4421 alu.dst.sel = ctx->temp_reg;
4423 r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4432 r = r600_bytecode_add_alu(ctx->bc, &alu);
4439 if (ctx->bc->chip_class == CAYMAN) {
4443 r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4445 alu.dst.sel = ctx->temp_reg;
4452 r = r600_bytecode_add_alu(ctx->bc, &alu);
4459 r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4461 alu.dst.sel = ctx->temp_reg;
4467 r = r600_bytecode_add_alu(ctx->bc, &alu);
4481 alu.dst.sel = ctx->temp_reg;
4485 r = r600_bytecode_add_alu(ctx->bc, &alu);
4489 return tgsi_helper_copy(ctx, inst);
4492 static int tgsi_log(struct r600_shader_ctx *ctx)
4494 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
4501 if (ctx->bc->chip_class == CAYMAN) {
4506 r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4509 alu.dst.sel = ctx->temp_reg;
4515 r = r600_bytecode_add_alu(ctx->bc, &alu);
4524 r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4527 alu.dst.sel = ctx->temp_reg;
4531 r = r600_bytecode_add_alu(ctx->bc, &alu);
4537 alu.src[0].sel = ctx->temp_reg;
4540 alu.dst.sel = ctx->temp_reg;
4545 r = r600_bytecode_add_alu(ctx->bc, &alu);
4553 if (ctx->bc->chip_class == CAYMAN) {
4558 r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4561 alu.dst.sel = ctx->temp_reg;
4568 r = r600_bytecode_add_alu(ctx->bc, &alu);
4576 r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4579 alu.dst.sel = ctx->temp_reg;
4584 r = r600_bytecode_add_alu(ctx->bc, &alu);
4592 alu.src[0].sel = ctx->temp_reg;
4595 alu.dst.sel = ctx->temp_reg;
4600 r = r600_bytecode_add_alu(ctx->bc, &alu);
4604 if (ctx->bc->chip_class == CAYMAN) {
4608 alu.src[0].sel = ctx->temp_reg;
4611 alu.dst.sel = ctx->temp_reg;
4618 r = r600_bytecode_add_alu(ctx->bc, &alu);
4625 alu.src[0].sel = ctx->temp_reg;
4628 alu.dst.sel = ctx->temp_reg;
4633 r = r600_bytecode_add_alu(ctx->bc, &alu);
4638 if (ctx->bc->chip_class == CAYMAN) {
4642 alu.src[0].sel = ctx->temp_reg;
4645 alu.dst.sel = ctx->temp_reg;
4652 r = r600_bytecode_add_alu(ctx->bc, &alu);
4659 alu.src[0].sel = ctx->temp_reg;
4662 alu.dst.sel = ctx->temp_reg;
4667 r = r600_bytecode_add_alu(ctx->bc, &alu);
4676 r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4679 alu.src[1].sel = ctx->temp_reg;
4682 alu.dst.sel = ctx->temp_reg;
4687 r = r600_bytecode_add_alu(ctx->bc, &alu);
4694 if (ctx->bc->chip_class == CAYMAN) {
4699 r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4702 alu.dst.sel = ctx->temp_reg;
4709 r = r600_bytecode_add_alu(ctx->bc, &alu);
4717 r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4720 alu.dst.sel = ctx->temp_reg;
4725 r = r600_bytecode_add_alu(ctx->bc, &alu);
4739 alu.dst.sel = ctx->temp_reg;
4744 r = r600_bytecode_add_alu(ctx->bc, &alu);
4749 return tgsi_helper_copy(ctx, inst);
4752 static int tgsi_eg_arl(struct r600_shader_ctx *ctx)
4754 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
4775 r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4777 alu.dst.sel = ctx->bc->ar_reg;
4779 r = r600_bytecode_add_alu(ctx->bc, &alu);
4783 ctx->bc->ar_loaded = 0;
4786 static int tgsi_r600_arl(struct r600_shader_ctx *ctx)
4788 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
4796 r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4797 alu.dst.sel = ctx->bc->ar_reg;
4801 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4806 alu.src[0].sel = ctx->bc->ar_reg;
4807 alu.dst.sel = ctx->bc->ar_reg;
4811 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4817 r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4818 alu.dst.sel = ctx->bc->ar_reg;
4822 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4828 r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4829 alu.dst.sel = ctx->bc->ar_reg;
4833 if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4841 ctx->bc->ar_loaded = 0;
4845 static int tgsi_opdst(struct r600_shader_ctx *ctx)
4847 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
4855 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4860 r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
4866 r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
4870 r = r600_bytecode_add_alu(ctx->bc, &alu);
4877 static int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
4887 alu.dst.sel = ctx->temp_reg;
4891 r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4897 r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
4903 static int pops(struct r600_shader_ctx *ctx, int pops)
4905 unsigned force_pop = ctx->bc->force_add_cf;
4909 if (ctx->bc->cf_last) {
4910 if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU))
4912 else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER))
4917 ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER);
4918 ctx->bc->force_add_cf = 1;
4920 ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER);
4921 ctx->bc->force_add_cf = 1;
4928 r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
4929 ctx->bc->cf_last->pop_count = pops;
4930 ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
4936 static inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
4940 ctx->bc->callstack[ctx->bc->call_sp].current--;
4944 ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
4948 ctx->bc->callstack[ctx->bc->call_sp].current --;
4953 static inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
4968 if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
4969 ctx->bc->callstack[ctx->bc->call_sp].max) {
4970 ctx->bc->callstack[ctx->bc->call_sp].max =
4971 ctx->bc->callstack[ctx->bc->call_sp].current + diff;
4977 ctx->bc->callstack[ctx->bc->call_sp].current++;
4981 ctx->bc->callstack[ctx->bc->call_sp].current += 4;
4984 ctx->bc->callstack[ctx->bc->call_sp].current++;
4988 if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
4989 ctx->bc->callstack[ctx->bc->call_sp].max) {
4990 ctx->bc->callstack[ctx->bc->call_sp].max =
4991 ctx->bc->callstack[ctx->bc->call_sp].current;
4995 static void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
4997 struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
5001 sp->mid[sp->num_mid] = ctx->bc->cf_last;
5005 static void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
5007 ctx->bc->fc_sp++;
5008 ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
5009 ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
5012 static void fc_poplevel(struct r600_shader_ctx *ctx)
5014 struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
5022 ctx->bc->fc_sp--;
5026 static int emit_return(struct r600_shader_ctx *ctx)
5028 r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN));
5032 static int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
5035 r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
5036 ctx->bc->cf_last->pop_count = pops;
5041 static int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
5046 static void emit_testflag(struct r600_shader_ctx *ctx)
5051 static void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
5053 emit_testflag(ctx);
5054 emit_jump_to_offset(ctx, 1, 4);
5055 emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
5056 pops(ctx, ifidx + 1);
5057 emit_return(ctx);
5060 static void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
5062 emit_testflag(ctx);
5064 r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
5065 ctx->bc->cf_last->pop_count = 1;
5067 fc_set_mid(ctx, fc_sp);
5069 pops(ctx, 1);
5073 static int tgsi_if(struct r600_shader_ctx *ctx)
5075 emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
5077 r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
5079 fc_pushlevel(ctx, FC_IF);
5081 callstack_check_depth(ctx, FC_PUSH_VPM, 0);
5085 static int tgsi_else(struct r600_shader_ctx *ctx)
5087 r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
5088 ctx->bc->cf_last->pop_count = 1;
5090 fc_set_mid(ctx, ctx->bc->fc_sp);
5091 ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
5095 static int tgsi_endif(struct r600_shader_ctx *ctx)
5097 pops(ctx, 1);
5098 if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
5103 if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
5104 ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
5105 ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
5107 ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
5109 fc_poplevel(ctx);
5111 callstack_decrease_current(ctx, FC_PUSH_VPM);
5115 static int tgsi_bgnloop(struct r600_shader_ctx *ctx)
5119 r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_DX10));
5121 fc_pushlevel(ctx, FC_LOOP);
5124 callstack_check_depth(ctx, FC_LOOP, 0);
5128 static int tgsi_endloop(struct r600_shader_ctx *ctx)
5132 r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
5134 if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
5144 ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
5146 ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
5148 for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
5149 ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
5152 fc_poplevel(ctx);
5153 callstack_decrease_current(ctx, FC_LOOP);
5157 static int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
5161 for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
5163 if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
5172 r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
5174 fc_set_mid(ctx, fscp);
5176 callstack_check_depth(ctx, FC_PUSH_VPM, 1);
5180 static int tgsi_umad(struct r600_shader_ctx *ctx)
5182 struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5195 alu.dst.sel = ctx->temp_reg;
5200 r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
5204 r = r600_bytecode_add_alu(ctx->bc, &alu);
5215 tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
5219 alu.src[0].sel = ctx->temp_reg;
5222 r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
5226 r = r600_bytecode_add_alu(ctx->bc, &alu);