glsl2: Add cmp field to ir_loop

This reprents the type of comparison between the loop induction
variable and the loop termination value.
This commit is contained in:
Ian Romanick
2010-08-26 15:11:26 -07:00
parent c8ee8e07f7
commit 3b85f1cc6c
3 changed files with 34 additions and 6 deletions

View File

@@ -701,6 +701,18 @@ ir_constant::has_value(const ir_constant *c) const
return true; 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) ir_dereference_variable::ir_dereference_variable(ir_variable *var)
{ {
this->ir_type = ir_type_dereference_variable; this->ir_type = ir_type_dereference_variable;

View File

@@ -461,10 +461,7 @@ public:
*/ */
class ir_loop : public ir_instruction { class ir_loop : public ir_instruction {
public: public:
ir_loop() : from(NULL), to(NULL), increment(NULL), counter(NULL) ir_loop();
{
ir_type = ir_type_loop;
}
virtual ir_loop *clone(void *mem_ctx, struct hash_table *ht) const; virtual ir_loop *clone(void *mem_ctx, struct hash_table *ht) const;
@@ -493,12 +490,30 @@ public:
/** /**
* \name Loop counter and controls * \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 *from; /** Value of the loop counter on the first
ir_rvalue *to; * iteration of the loop.
*/
ir_rvalue *to; /** Value of the loop counter on the last
* iteration of the loop.
*/
ir_rvalue *increment; ir_rvalue *increment;
ir_variable *counter; 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;
/*@}*/ /*@}*/
}; };

View File

@@ -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->body_instructions.push_tail(ir->clone(mem_ctx, ht));
} }
new_loop->cmp = this->cmp;
return new_loop; return new_loop;
} }