[Mesa-dev] [PATCH 2/2] r300/compiler: copy-propagate saturate mode when possible

Marek Olšák maraeo at gmail.com
Sun Feb 3 09:22:42 PST 2013


---
 .../drivers/r300/compiler/radeon_optimize.c        |   21 ++++++++++++++++++--
 1 file 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 */
-- 
1.7.10.4



More information about the mesa-dev mailing list