r300/compiler: copy-propagate saturate mode when possible
Reviewed-by: Tom Stellard <thomas.stellard@amd.com>
This commit is contained in:
parent
ae8696c7ee
commit
1d3561d877
|
@ -143,8 +143,7 @@ static void copy_propagate(struct radeon_compiler * c, struct rc_instruction * i
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
if (inst_mov->U.I.DstReg.File != RC_FILE_TEMPORARY ||
|
if (inst_mov->U.I.DstReg.File != RC_FILE_TEMPORARY ||
|
||||||
inst_mov->U.I.WriteALUResult ||
|
inst_mov->U.I.WriteALUResult)
|
||||||
inst_mov->U.I.SaturateMode)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Get a list of all the readers of this MOV instruction. */
|
/* 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)
|
if (reader_data.Abort || reader_data.ReaderCount == 0)
|
||||||
return;
|
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. */
|
/* Propagate the MOV instruction. */
|
||||||
for (i = 0; i < reader_data.ReaderCount; i++) {
|
for (i = 0; i < reader_data.ReaderCount; i++) {
|
||||||
struct rc_instruction * inst = reader_data.Readers[i].Inst;
|
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)
|
if (inst_mov->U.I.SrcReg[0].File == RC_FILE_PRESUB)
|
||||||
inst->U.I.PreSub = inst_mov->U.I.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 */
|
/* Finally, remove the original MOV instruction */
|
||||||
|
|
Loading…
Reference in New Issue