r300/compiler: copy-propagate saturate mode when possible
authorMarek Olšák <maraeo@gmail.com>
Sun, 3 Feb 2013 15:54:59 +0000 (16:54 +0100)
committerMarek Olšák <maraeo@gmail.com>
Wed, 6 Feb 2013 13:45:20 +0000 (14:45 +0100)
Reviewed-by: Tom Stellard <thomas.stellard@amd.com>
src/gallium/drivers/r300/compiler/radeon_optimize.c

index 0714d794182bb4da8a6b575478a506989ce3f4f2..7be9d9e525bf4af88ef651ee8c3f16e2ffb22aed 100644 (file)
@@ -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 */