"Fossies" - the Fresh Open Source Software Archive

Member "mesa-20.1.8/src/gallium/drivers/r300/compiler/radeon_rename_regs.c" (16 Sep 2020, 2876 Bytes) of package /linux/misc/mesa-20.1.8.tar.xz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "radeon_rename_regs.c" see the Fossies "Dox" file reference documentation.

    1 /*
    2  * Copyright 2010 Tom Stellard <tstellar@gmail.com>
    3  *
    4  * All Rights Reserved.
    5  *
    6  * Permission is hereby granted, free of charge, to any person obtaining
    7  * a copy of this software and associated documentation files (the
    8  * "Software"), to deal in the Software without restriction, including
    9  * without limitation the rights to use, copy, modify, merge, publish,
   10  * distribute, sublicense, and/or sell copies of the Software, and to
   11  * permit persons to whom the Software is furnished to do so, subject to
   12  * the following conditions:
   13  *
   14  * The above copyright notice and this permission notice (including the
   15  * next paragraph) shall be included in all copies or substantial
   16  * portions of the Software.
   17  *
   18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
   19  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
   20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
   21  * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
   22  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
   23  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
   24  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
   25  *
   26  */
   27 
   28 /**
   29  * \file
   30  */
   31 
   32 #include "radeon_rename_regs.h"
   33 
   34 #include "radeon_compiler.h"
   35 #include "radeon_list.h"
   36 #include "radeon_program.h"
   37 #include "radeon_variable.h"
   38 
   39 /**
   40  * This function renames registers in an attempt to get the code close to
   41  * SSA form.  After this function has completed, most of the register are only
   42  * written to one time, with a few exceptions.
   43  *
   44  * This function assumes all the instructions are still of type
   45  * RC_INSTRUCTION_NORMAL.
   46  */
   47 void rc_rename_regs(struct radeon_compiler *c, void *user)
   48 {
   49     unsigned int used_length;
   50     struct rc_instruction * inst;
   51     unsigned char * used;
   52     struct rc_list * variables;
   53     struct rc_list * var_ptr;
   54 
   55     /* XXX Remove this once the register allocation works with flow control. */
   56     for(inst = c->Program.Instructions.Next;
   57                     inst != &c->Program.Instructions;
   58                     inst = inst->Next) {
   59         if (inst->U.I.Opcode == RC_OPCODE_BGNLOOP)
   60             return;
   61     }
   62 
   63     used_length = 2 * rc_recompute_ips(c);
   64     used = memory_pool_malloc(&c->Pool, sizeof(unsigned char) * used_length);
   65     memset(used, 0, sizeof(unsigned char) * used_length);
   66 
   67     rc_get_used_temporaries(c, used, used_length);
   68     variables = rc_get_variables(c);
   69 
   70     for (var_ptr = variables; var_ptr; var_ptr = var_ptr->Next) {
   71         int new_index;
   72         unsigned writemask;
   73         struct rc_variable * var = var_ptr->Item;
   74 
   75         if (var->Inst->U.I.DstReg.File != RC_FILE_TEMPORARY) {
   76             continue;
   77         }
   78 
   79         new_index = rc_find_free_temporary_list(c, used, used_length,
   80                         RC_MASK_XYZW);
   81         if (new_index < 0) {
   82             rc_error(c, "Ran out of temporary registers\n");
   83             return;
   84         }
   85 
   86         writemask = rc_variable_writemask_sum(var);
   87         rc_variable_change_dst(var, new_index, writemask);
   88     }
   89 }