diff options
author | Ian Romanick <[email protected]> | 2010-08-26 15:11:26 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2010-09-03 11:55:21 -0700 |
commit | 3b85f1cc6cb12e9d4931e12cf29adde578f389fd (patch) | |
tree | 53c6e568c2d8ba880fda98df58684ae7653bb577 /src/glsl | |
parent | c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4 (diff) |
glsl2: Add cmp field to ir_loop
This reprents the type of comparison between the loop induction
variable and the loop termination value.
Diffstat (limited to 'src/glsl')
-rw-r--r-- | src/glsl/ir.cpp | 12 | ||||
-rw-r--r-- | src/glsl/ir.h | 27 | ||||
-rw-r--r-- | src/glsl/ir_clone.cpp | 1 |
3 files changed, 34 insertions, 6 deletions
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp index 68ad512bf50..96b32a2f34b 100644 --- a/src/glsl/ir.cpp +++ b/src/glsl/ir.cpp @@ -701,6 +701,18 @@ ir_constant::has_value(const ir_constant *c) const return true; } + +ir_loop::ir_loop() +{ + this->ir_type = ir_type_loop; + this->cmp = ir_unop_neg; + this->from = NULL; + this->to = NULL; + this->increment = NULL; + this->counter = NULL; +} + + ir_dereference_variable::ir_dereference_variable(ir_variable *var) { this->ir_type = ir_type_dereference_variable; diff --git a/src/glsl/ir.h b/src/glsl/ir.h index 0f887a9327e..cf3a882f079 100644 --- a/src/glsl/ir.h +++ b/src/glsl/ir.h @@ -461,10 +461,7 @@ public: */ class ir_loop : public ir_instruction { public: - ir_loop() : from(NULL), to(NULL), increment(NULL), counter(NULL) - { - ir_type = ir_type_loop; - } + ir_loop(); virtual ir_loop *clone(void *mem_ctx, struct hash_table *ht) const; @@ -493,12 +490,30 @@ public: /** * \name Loop counter and controls + * + * Represents a loop like a FORTRAN \c do-loop. + * + * \note + * If \c from and \c to are the same value, the loop will execute once. */ /*@{*/ - ir_rvalue *from; - ir_rvalue *to; + ir_rvalue *from; /** Value of the loop counter on the first + * iteration of the loop. + */ + ir_rvalue *to; /** Value of the loop counter on the last + * iteration of the loop. + */ ir_rvalue *increment; ir_variable *counter; + + /** + * Comparison operation in the loop terminator. + * + * If any of the loop control fields are non-\c NULL, this field must be + * one of \c ir_binop_less, \c ir_binop_greater, \c ir_binop_lequal, + * \c ir_binop_gequal, \c ir_binop_equal, or \c ir_binop_nequal. + */ + int cmp; /*@}*/ }; diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp index 1d690a4da7c..3b8beb54b53 100644 --- a/src/glsl/ir_clone.cpp +++ b/src/glsl/ir_clone.cpp @@ -134,6 +134,7 @@ ir_loop::clone(void *mem_ctx, struct hash_table *ht) const new_loop->body_instructions.push_tail(ir->clone(mem_ctx, ht)); } + new_loop->cmp = this->cmp; return new_loop; } |