summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Stellard <tstellar@gmail.com>2010-06-14 22:30:02 -0700
committerMarek Olšák <maraeo@gmail.com>2010-07-03 04:27:09 +0200
commit1732751242fe0e05c02dfbc8ef5b386fbedc044e (patch)
tree441740b7b63b413d92d6e724ae3c40194e78e607 /src
parent29a1d6aee7a07ab9d0d6007226719a2fa8a5ee25 (diff)
r300/compiler: In the peephole optimizer, ELSE should mark the end of a
block.
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/r300/compiler/radeon_optimize.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c b/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c
index 21d7210888..e760b59bd4 100644
--- a/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c
+++ b/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c
@@ -75,6 +75,15 @@ struct peephole_state {
int BranchDepth;
};
+/**
+ * This is a callback function that is meant to be passed to
+ * rc_for_all_reads_mask. This function will be called once for each source
+ * register in inst.
+ * @param inst The instruction that the source register belongs to.
+ * @param file The register file of the source register.
+ * @param index The index of the source register.
+ * @param mask The components of the source register that are being read from.
+ */
static void peephole_scan_read(void * data, struct rc_instruction * inst,
rc_register_file file, unsigned int index, unsigned int mask)
{
@@ -161,7 +170,8 @@ static void peephole(struct radeon_compiler * c, struct rc_instruction * inst_mo
if (s.BranchDepth >= 0) {
if (inst->U.I.Opcode == RC_OPCODE_IF) {
s.BranchDepth++;
- } else if (inst->U.I.Opcode == RC_OPCODE_ENDIF) {
+ } else if (inst->U.I.Opcode == RC_OPCODE_ENDIF
+ || inst->U.I.Opcode == RC_OPCODE_ELSE) {
s.BranchDepth--;
if (s.BranchDepth < 0) {
s.DefinedMask &= ~s.MovMask;
@@ -208,7 +218,8 @@ static void peephole(struct radeon_compiler * c, struct rc_instruction * inst_mo
if (s.BranchDepth >= 0) {
if (inst->U.I.Opcode == RC_OPCODE_IF) {
s.BranchDepth++;
- } else if (inst->U.I.Opcode == RC_OPCODE_ENDIF) {
+ } else if (inst->U.I.Opcode == RC_OPCODE_ENDIF
+ || inst->U.I.Opcode == RC_OPCODE_ELSE) {
s.BranchDepth--;
if (s.BranchDepth < 0)
break; /* no more readers after this point */