Module: Mesa
Branch: master
Commit: 1d3561d877c8294ffccfd6765268f32dc9ae62cf
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=1d3561d877c8294ffccfd6765268f32dc9ae62cf

Author: Marek Olšák <[email protected]>
Date:   Sun Feb  3 16:54:59 2013 +0100

r300/compiler: copy-propagate saturate mode when possible

Reviewed-by: Tom Stellard <[email protected]>

---

 .../drivers/r300/compiler/radeon_optimize.c        |   21 ++++++++++++++++++-
 1 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/r300/compiler/radeon_optimize.c 
b/src/gallium/drivers/r300/compiler/radeon_optimize.c
index 0714d79..7be9d9e 100644
--- a/src/gallium/drivers/r300/compiler/radeon_optimize.c
+++ b/src/gallium/drivers/r300/compiler/radeon_optimize.c
@@ -143,8 +143,7 @@ static void copy_propagate(struct radeon_compiler * c, 
struct rc_instruction * i
        unsigned int i;
 
        if (inst_mov->U.I.DstReg.File != RC_FILE_TEMPORARY ||
-           inst_mov->U.I.WriteALUResult ||
-           inst_mov->U.I.SaturateMode)
+           inst_mov->U.I.WriteALUResult)
                return;
 
        /* Get a list of all the readers of this MOV instruction. */
@@ -156,6 +155,22 @@ static void copy_propagate(struct radeon_compiler * c, 
struct rc_instruction * i
        if (reader_data.Abort || reader_data.ReaderCount == 0)
                return;
 
+       /* We can propagate SaturateMode if all the readers are MOV instructions
+        * without a presubtract operation, source negation and absolute.
+        * In that case, we just move SaturateMode to all readers. */
+        if (inst_mov->U.I.SaturateMode) {
+               for (i = 0; i < reader_data.ReaderCount; i++) {
+                       struct rc_instruction * inst = 
reader_data.Readers[i].Inst;
+
+                       if (inst->U.I.Opcode != RC_OPCODE_MOV ||
+                           inst->U.I.SrcReg[0].File == RC_FILE_PRESUB ||
+                           inst->U.I.SrcReg[0].Abs ||
+                           inst->U.I.SrcReg[0].Negate) {
+                               return;
+                       }
+               }
+       }
+
        /* Propagate the MOV instruction. */
        for (i = 0; i < reader_data.ReaderCount; i++) {
                struct rc_instruction * inst = reader_data.Readers[i].Inst;
@@ -163,6 +178,8 @@ static void copy_propagate(struct radeon_compiler * c, 
struct rc_instruction * i
 
                if (inst_mov->U.I.SrcReg[0].File == RC_FILE_PRESUB)
                        inst->U.I.PreSub = inst_mov->U.I.PreSub;
+               if (!inst->U.I.SaturateMode)
+                       inst->U.I.SaturateMode = inst_mov->U.I.SaturateMode;
        }
 
        /* Finally, remove the original MOV instruction */

_______________________________________________
mesa-commit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to