Browse Source

Add ir_loop_jump to represent 'break' and 'continue' in loops

tags/mesa-7.9-rc1
Ian Romanick 15 years ago
parent
commit
f8e31e00b1
7 changed files with 71 additions and 0 deletions
  1. 45
    0
      ir.h
  2. 9
    0
      ir_constant_expression.cpp
  3. 7
    0
      ir_constant_folding.cpp
  4. 1
    0
      ir_constant_folding.h
  5. 7
    0
      ir_print_visitor.cpp
  6. 1
    0
      ir_print_visitor.h
  7. 1
    0
      ir_visitor.h

+ 45
- 0
ir.h View File

@@ -532,6 +532,51 @@ public:
private:
ir_rvalue *value;
};


/**
* Jump instructions used inside loops
*
* These include \c break and \c continue. The \c break within a loop is
* different from the \c break within a switch-statement.
*
* \sa ir_switch_jump
*/
class ir_loop_jump : public ir_jump {
public:
enum jump_mode {
jump_break,
jump_continue
};

ir_loop_jump(ir_loop *loop, jump_mode mode)
: loop(loop), mode(mode)
{
/* empty */
}

virtual void accept(ir_visitor *v)
{
v->visit(this);
}

bool is_break() const
{
return mode == jump_break;
}

bool is_continue() const
{
return mode == jump_continue;
}

private:
/** Loop containing this break instruction. */
ir_loop *loop;

/** Mode selector for the jump instruction. */
enum jump_mode mode;
};
/*@}*/



+ 9
- 0
ir_constant_expression.cpp View File

@@ -75,6 +75,7 @@ public:
virtual void visit(ir_return *);
virtual void visit(ir_if *);
virtual void visit(ir_loop *);
virtual void visit(ir_loop_jump *);
/*@}*/

/**
@@ -473,3 +474,11 @@ ir_constant_visitor::visit(ir_loop *ir)
(void) ir;
value = NULL;
}


void
ir_constant_visitor::visit(ir_loop_jump *ir)
{
(void) ir;
value = NULL;
}

+ 7
- 0
ir_constant_folding.cpp View File

@@ -152,3 +152,10 @@ ir_constant_folding_visitor::visit(ir_loop *ir)
{
(void) ir;
}


void
ir_constant_folding_visitor::visit(ir_loop_jump *ir)
{
(void) ir;
}

+ 1
- 0
ir_constant_folding.h View File

@@ -59,5 +59,6 @@ public:
virtual void visit(ir_return *);
virtual void visit(ir_if *);
virtual void visit(ir_loop *);
virtual void visit(ir_loop_jump *);
/*@}*/
};

+ 7
- 0
ir_print_visitor.cpp View File

@@ -319,3 +319,10 @@ ir_print_visitor::visit(ir_loop *ir)
}
printf("))\n");
}


void
ir_print_visitor::visit(ir_loop_jump *ir)
{
printf("%s", ir->is_break() ? "break" : "continue");
}

+ 1
- 0
ir_print_visitor.h View File

@@ -66,6 +66,7 @@ public:
virtual void visit(ir_return *);
virtual void visit(ir_if *);
virtual void visit(ir_loop *);
virtual void visit(ir_loop_jump *);
/*@}*/

private:

+ 1
- 0
ir_visitor.h View File

@@ -57,6 +57,7 @@ public:
virtual void visit(class ir_return *) = 0;
virtual void visit(class ir_if *) = 0;
virtual void visit(class ir_loop *) = 0;
virtual void visit(class ir_loop_jump *) = 0;
/*@}*/
};


Loading…
Cancel
Save