Mesa (master): r300/compiler: Fix loop unrolling

Marek Olšák mareko at kemper.freedesktop.org
Sat Jul 3 02:35:21 UTC 2010


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

Author: Tom Stellard <tstellar at gmail.com>
Date:   Thu Jun 24 18:45:46 2010 -0700

r300/compiler: Fix loop unrolling

---

 .../dri/r300/compiler/radeon_emulate_loops.c       |   16 +++++++++++++++-
 1 files changed, 15 insertions(+), 1 deletions(-)

diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_emulate_loops.c b/src/mesa/drivers/dri/r300/compiler/radeon_emulate_loops.c
index 696cfd5..131e9e7 100644
--- a/src/mesa/drivers/dri/r300/compiler/radeon_emulate_loops.c
+++ b/src/mesa/drivers/dri/r300/compiler/radeon_emulate_loops.c
@@ -267,8 +267,22 @@ static int transform_const_loop(struct emulate_loop_state * s,
 	 * simple, since we only support increment and decrement loops.
 	 */
 	limit_value = get_constant_value(s->C, limit, 0);
-	iterations = (int) ((limit_value - counter_value.Value) /
+	DBG("Limit is %f.\n", limit_value);
+	switch(loop->Cond->U.I.Opcode){
+	case RC_OPCODE_SGT:
+	case RC_OPCODE_SLT:
+		iterations = (int) ceilf((limit_value - counter_value.Value) /
 							count_inst.Amount);
+		break;
+
+	case RC_OPCODE_SLE:
+	case RC_OPCODE_SGE:
+		iterations = (int) floorf((limit_value - counter_value.Value) /
+							count_inst.Amount) + 1;
+		break;
+	default:
+		return 0;
+	}
 
 	DBG("Loop will have %d iterations.\n", iterations);
 	




More information about the mesa-commit mailing list