r300/compiler: Move some helper functions to radeon_compiler_util.c
authorTom Stellard <tstellar@gmail.com>
Wed, 15 Jun 2011 15:00:13 +0000 (08:00 -0700)
committerTom Stellard <tstellar@gmail.com>
Sat, 17 Sep 2011 00:19:56 +0000 (17:19 -0700)
src/gallium/drivers/r300/compiler/radeon_compiler_util.c
src/gallium/drivers/r300/compiler/radeon_compiler_util.h
src/gallium/drivers/r300/compiler/radeon_emulate_loops.c

index 2742721f80015ea25031e8d8f9c355505c6cedad..33dbe0e86e9f06ae699147375c62494782e9528c 100644 (file)
@@ -699,3 +699,38 @@ unsigned int rc_make_conversion_swizzle(
        }
        return conversion_swizzle;
 }
+
+/**
+ * @return 1 if the register contains an immediate value, 0 otherwise.
+ */
+unsigned int rc_src_reg_is_immediate(
+       struct radeon_compiler * c,
+       unsigned int file,
+       unsigned int index)
+{
+       return file == RC_FILE_CONSTANT &&
+       c->Program.Constants.Constants[index].Type == RC_CONSTANT_IMMEDIATE;
+}
+
+/**
+ * @return The immediate value in the specified register.
+ */
+float rc_get_constant_value(
+       struct radeon_compiler * c,
+       unsigned int index,
+       unsigned int swizzle,
+       unsigned int negate,
+       unsigned int chan)
+{
+       float base = 1.0f;
+       int swz = GET_SWZ(swizzle, chan);
+       if(swz >= 4 || index >= c->Program.Constants.Count ){
+               rc_error(c, "get_constant_value: Can't find a value.\n");
+               return 0.0f;
+       }
+       if(GET_BIT(negate, chan)){
+               base = -1.0f;
+       }
+       return base *
+               c->Program.Constants.Constants[index].u.Immediate[swz];
+}
index 3730aa888c0b7a4217e6b22f1152c73e9671cb90..58bdb3c684b7a258c52c03038c720c5503272adb 100644 (file)
@@ -86,4 +86,17 @@ unsigned int rc_make_conversion_swizzle(
        unsigned int old_mask,
        unsigned int new_mask);
 
+unsigned int rc_src_reg_is_immediate(
+       struct radeon_compiler * c,
+       unsigned int file,
+       unsigned int index);
+
+float rc_get_constant_value(
+       struct radeon_compiler * c,
+       unsigned int index,
+       unsigned int swizzle,
+       unsigned int negate,
+       unsigned int chan);
+
+
 #endif /* RADEON_PROGRAM_UTIL_H */
index 8c46db080935f72103b63d55d806addbb5acf808..91ed9d2615d8fffe10259a50eae6e33709c8c4eb 100644 (file)
@@ -32,6 +32,7 @@
 #include "radeon_emulate_loops.h"
 
 #include "radeon_compiler.h"
+#include "radeon_compiler_util.h"
 #include "radeon_dataflow.h"
 
 #define VERBOSE 0
@@ -54,30 +55,6 @@ struct count_inst {
        unsigned BranchDepth;
 };
 
-static float get_constant_value(struct radeon_compiler * c,
-                                               struct rc_src_register * src,
-                                               int chan)
-{
-       float base = 1.0f;
-       int swz = GET_SWZ(src->Swizzle, chan);
-       if(swz >= 4 || src->Index >= c->Program.Constants.Count ){
-               rc_error(c, "get_constant_value: Can't find a value.\n");
-               return 0.0f;
-       }
-       if(GET_BIT(src->Negate, chan)){
-               base = -1.0f;
-       }
-       return base *
-               c->Program.Constants.Constants[src->Index].u.Immediate[swz];
-}
-
-static int src_reg_is_immediate(struct rc_src_register * src,
-                                               struct radeon_compiler * c)
-{
-       return src->File == RC_FILE_CONSTANT &&
-       c->Program.Constants.Constants[src->Index].Type==RC_CONSTANT_IMMEDIATE;
-}
-
 static unsigned int loop_max_possible_iterations(struct radeon_compiler *c,
                        struct loop_info * loop)
 {
@@ -119,12 +96,16 @@ static void update_const_value(void * data, struct rc_instruction * inst,
        }
        switch(inst->U.I.Opcode){
        case RC_OPCODE_MOV:
-               if(!src_reg_is_immediate(&inst->U.I.SrcReg[0], value->C)){
+               if(!rc_src_reg_is_immediate(value->C, inst->U.I.SrcReg[0].File,
+                                               inst->U.I.SrcReg[0].Index)){
                        return;
                }
                value->HasValue = 1;
                value->Value =
-                       get_constant_value(value->C, &inst->U.I.SrcReg[0], 0);
+                       rc_get_constant_value(value->C,
+                                             inst->U.I.SrcReg[0].Index,
+                                             inst->U.I.SrcReg[0].Swizzle,
+                                             inst->U.I.SrcReg[0].Negate, 0);
                break;
        }
 }
@@ -169,10 +150,13 @@ static void get_incr_amount(void * data, struct rc_instruction * inst,
                count_inst->Unknown = 1;
                return;
        }
-       if(src_reg_is_immediate(&inst->U.I.SrcReg[amnt_src_index],
-                                                       count_inst->C)){
-               amount = get_constant_value(count_inst->C,
-                               &inst->U.I.SrcReg[amnt_src_index], 0);
+       if(rc_src_reg_is_immediate(count_inst->C,
+                               inst->U.I.SrcReg[amnt_src_index].File,
+                               inst->U.I.SrcReg[amnt_src_index].Index)){
+               amount = rc_get_constant_value(count_inst->C,
+                               inst->U.I.SrcReg[amnt_src_index].Index,
+                               inst->U.I.SrcReg[amnt_src_index].Swizzle,
+                               inst->U.I.SrcReg[amnt_src_index].Negate, 0);
        }
        else{
                count_inst->Unknown = 1 ;
@@ -212,11 +196,13 @@ static int try_unroll_loop(struct radeon_compiler * c, struct loop_info * loop)
 
        /* Find the counter and the upper limit */
 
-       if(src_reg_is_immediate(&loop->Cond->U.I.SrcReg[0], c)){
+       if(rc_src_reg_is_immediate(c, loop->Cond->U.I.SrcReg[0].File,
+                                       loop->Cond->U.I.SrcReg[0].Index)){
                limit = &loop->Cond->U.I.SrcReg[0];
                counter = &loop->Cond->U.I.SrcReg[1];
        }
-       else if(src_reg_is_immediate(&loop->Cond->U.I.SrcReg[1], c)){
+       else if(rc_src_reg_is_immediate(c, loop->Cond->U.I.SrcReg[1].File,
+                                       loop->Cond->U.I.SrcReg[1].Index)){
                limit = &loop->Cond->U.I.SrcReg[1];
                counter = &loop->Cond->U.I.SrcReg[0];
        }
@@ -290,7 +276,8 @@ static int try_unroll_loop(struct radeon_compiler * c, struct loop_info * loop)
        /* Calculate the number of iterations of this loop.  Keeping this
         * simple, since we only support increment and decrement loops.
         */
-       limit_value = get_constant_value(c, limit, 0);
+       limit_value = rc_get_constant_value(c, limit->Index, limit->Swizzle,
+                                                       limit->Negate, 0);
        DBG("Limit is %f.\n", limit_value);
        /* The iteration calculations are opposite of what you would expect.
         * In a normal loop, if the condition is met, then loop continues, but