summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/r300/compiler/radeon_program.c
diff options
context:
space:
mode:
authorNicolai Hähnle <nhaehnle@gmail.com>2009-09-06 11:47:40 +0200
committerNicolai Hähnle <nhaehnle@gmail.com>2009-09-06 11:47:40 +0200
commite95e76e1255a3ad0ce604271301d090337b2e82b (patch)
tree2f164b0c45576b27d70130e6f2ea58b3bb62d880 /src/mesa/drivers/dri/r300/compiler/radeon_program.c
parentd1b4351e603522be11061522cb6b685da9ef1fee (diff)
r300/compiler: New dataflow structures and passes
This replaces the old NQSSADCE code with the same functionality, but quite different design. Instead of doing a single integerated pass, we now build explicit data structures representing the dataflow. This will enable analysis of flow control instruction, and could potentially open an avenue for several dataflow based optimizations, such as peephole optimization, fusing MUL+ADD to MAD, and so on.
Diffstat (limited to 'src/mesa/drivers/dri/r300/compiler/radeon_program.c')
-rw-r--r--src/mesa/drivers/dri/r300/compiler/radeon_program.c150
1 files changed, 1 insertions, 149 deletions
diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_program.c b/src/mesa/drivers/dri/r300/compiler/radeon_program.c
index 0e0c1f68e6..b97c48084b 100644
--- a/src/mesa/drivers/dri/r300/compiler/radeon_program.c
+++ b/src/mesa/drivers/dri/r300/compiler/radeon_program.c
@@ -154,155 +154,7 @@ struct rc_instruction *rc_insert_new_instruction(struct radeon_compiler * c, str
void rc_remove_instruction(struct rc_instruction * inst)
{
+ rc_dataflow_remove_instruction(inst);
inst->Prev->Next = inst->Next;
inst->Next->Prev = inst->Prev;
}
-
-static const char * textarget_to_string(rc_texture_target target)
-{
- switch(target) {
- case RC_TEXTURE_2D_ARRAY: return "2D_ARRAY";
- case RC_TEXTURE_1D_ARRAY: return "1D_ARRAY";
- case RC_TEXTURE_CUBE: return "CUBE";
- case RC_TEXTURE_3D: return "3D";
- case RC_TEXTURE_RECT: return "RECT";
- case RC_TEXTURE_2D: return "2D";
- case RC_TEXTURE_1D: return "1D";
- default: return "BAD_TEXTURE_TARGET";
- }
-}
-
-static void rc_print_register(FILE * f, rc_register_file file, int index, unsigned int reladdr)
-{
- if (file == RC_FILE_NONE) {
- fprintf(f, "none");
- } else {
- const char * filename;
- switch(file) {
- case RC_FILE_TEMPORARY: filename = "temp"; break;
- case RC_FILE_INPUT: filename = "input"; break;
- case RC_FILE_OUTPUT: filename = "output"; break;
- case RC_FILE_ADDRESS: filename = "addr"; break;
- case RC_FILE_CONSTANT: filename = "const"; break;
- default: filename = "BAD FILE"; break;
- }
- fprintf(f, "%s[%i%s]", filename, index, reladdr ? " + addr[0]" : "");
- }
-}
-
-static void rc_print_mask(FILE * f, unsigned int mask)
-{
- if (mask & RC_MASK_X) fprintf(f, "x");
- if (mask & RC_MASK_Y) fprintf(f, "y");
- if (mask & RC_MASK_Z) fprintf(f, "z");
- if (mask & RC_MASK_W) fprintf(f, "w");
-}
-
-static void rc_print_dst_register(FILE * f, struct rc_dst_register dst)
-{
- rc_print_register(f, dst.File, dst.Index, dst.RelAddr);
- if (dst.WriteMask != RC_MASK_XYZW) {
- fprintf(f, ".");
- rc_print_mask(f, dst.WriteMask);
- }
-}
-
-static void rc_print_swizzle(FILE * f, unsigned int swizzle, unsigned int negate)
-{
- unsigned int comp;
- for(comp = 0; comp < 4; ++comp) {
- rc_swizzle swz = GET_SWZ(swizzle, comp);
- if (GET_BIT(negate, comp))
- fprintf(f, "-");
- switch(swz) {
- case RC_SWIZZLE_X: fprintf(f, "x"); break;
- case RC_SWIZZLE_Y: fprintf(f, "y"); break;
- case RC_SWIZZLE_Z: fprintf(f, "z"); break;
- case RC_SWIZZLE_W: fprintf(f, "w"); break;
- case RC_SWIZZLE_ZERO: fprintf(f, "0"); break;
- case RC_SWIZZLE_ONE: fprintf(f, "1"); break;
- case RC_SWIZZLE_HALF: fprintf(f, "H"); break;
- case RC_SWIZZLE_UNUSED: fprintf(f, "_"); break;
- }
- }
-}
-
-static void rc_print_src_register(FILE * f, struct rc_src_register src)
-{
- int trivial_negate = (src.Negate == RC_MASK_NONE || src.Negate == RC_MASK_XYZW);
-
- if (src.Negate == RC_MASK_XYZW)
- fprintf(f, "-");
- if (src.Abs)
- fprintf(f, "|");
-
- rc_print_register(f, src.File, src.Index, src.RelAddr);
-
- if (src.Abs && !trivial_negate)
- fprintf(f, "|");
-
- if (src.Swizzle != RC_SWIZZLE_XYZW || !trivial_negate) {
- fprintf(f, ".");
- rc_print_swizzle(f, src.Swizzle, trivial_negate ? 0 : src.Negate);
- }
-
- if (src.Abs && trivial_negate)
- fprintf(f, "|");
-}
-
-static void rc_print_instruction(FILE * f, struct rc_instruction * inst)
-{
- const struct rc_opcode_info * opcode = rc_get_opcode_info(inst->I.Opcode);
- unsigned int reg;
-
- fprintf(f, "%s", opcode->Name);
-
- switch(inst->I.SaturateMode) {
- case RC_SATURATE_NONE: break;
- case RC_SATURATE_ZERO_ONE: fprintf(f, "_SAT"); break;
- case RC_SATURATE_MINUS_PLUS_ONE: fprintf(f, "_SAT2"); break;
- default: fprintf(f, "_BAD_SAT"); break;
- }
-
- if (opcode->HasDstReg) {
- fprintf(f, " ");
- rc_print_dst_register(f, inst->I.DstReg);
- if (opcode->NumSrcRegs)
- fprintf(f, ",");
- }
-
- for(reg = 0; reg < opcode->NumSrcRegs; ++reg) {
- if (reg > 0)
- fprintf(f, ",");
- fprintf(f, " ");
- rc_print_src_register(f, inst->I.SrcReg[reg]);
- }
-
- if (opcode->HasTexture) {
- fprintf(f, ", %s%s[%u]",
- textarget_to_string(inst->I.TexSrcTarget),
- inst->I.TexShadow ? "SHADOW" : "",
- inst->I.TexSrcUnit);
- }
-
- fprintf(f, ";\n");
-}
-
-/**
- * Print program to stderr, default options.
- */
-void rc_print_program(const struct rc_program *prog)
-{
- unsigned int linenum = 0;
- struct rc_instruction *inst;
-
- fprintf(stderr, "# Radeon Compiler Program\n");
-
- for(inst = prog->Instructions.Next; inst != &prog->Instructions; inst = inst->Next) {
- fprintf(stderr, "%3d: ", linenum);
-
- rc_print_instruction(stderr, inst);
-
- linenum++;
- }
-}