@@ -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; | |||
}; | |||
/*@}*/ | |||
@@ -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; | |||
} |
@@ -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; | |||
} |
@@ -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 *); | |||
/*@}*/ | |||
}; |
@@ -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"); | |||
} |
@@ -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: |
@@ -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; | |||
/*@}*/ | |||
}; | |||