Implement IR return instructions
authorIan Romanick <ian.d.romanick@intel.com>
Fri, 19 Mar 2010 23:44:52 +0000 (16:44 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 19 Mar 2010 23:44:52 +0000 (16:44 -0700)
ir.h
ir_print_visitor.cpp
ir_print_visitor.h
ir_visitor.h

diff --git a/ir.h b/ir.h
index c7fd981..ab598ee 100644 (file)
--- a/ir.h
+++ b/ir.h
@@ -323,6 +323,51 @@ private:
 };
 
 
+/**
+ * \name Jump-like IR instructions.
+ *
+ * These include \c break, \c continue, \c return, and \c discard.
+ */
+/*@{*/
+class ir_jump : public ir_instruction {
+protected:
+   ir_jump()
+      : ir_instruction(ir_op_jump)
+   {
+      /* empty */
+   }
+};
+
+class ir_return : public ir_jump {
+public:
+   ir_return()
+      : value(NULL)
+   {
+      /* empty */
+   }
+
+   ir_return(ir_expression *value)
+      : value(value)
+   {
+      /* empty */
+   }
+
+   ir_expression *get_value() const
+   {
+      return value;
+   }
+
+   virtual void accept(ir_visitor *v)
+   {
+      v->visit(this);
+   }
+
+private:
+   ir_expression *value;
+};
+/*@}*/
+
+
 struct ir_swizzle_mask {
    unsigned x:2;
    unsigned y:2;
index b1c718d..f9f3d3f 100644 (file)
@@ -142,3 +142,18 @@ ir_print_visitor::visit(ir_call *ir)
    printf("(call FINISHME: function name here\n");
    printf("    (FINISHME: function paramaters here))\n");
 }
+
+
+void
+ir_print_visitor::visit(ir_return *ir)
+{
+   printf("(return");
+
+   ir_expression *const value = ir->get_value();
+   if (value) {
+      printf(" ");
+      value->accept(this);
+   }
+
+   printf(")\n");
+}
index b76de50..121b7e8 100644 (file)
@@ -61,6 +61,7 @@ public:
    virtual void visit(ir_assignment *);
    virtual void visit(ir_constant *);
    virtual void visit(ir_call *);
+   virtual void visit(ir_return *);
    /*@}*/
 };
 
index a2b2dd6..8ea416e 100644 (file)
@@ -53,6 +53,7 @@ public:
    virtual void visit(class ir_assignment *) = 0;
    virtual void visit(class ir_constant *) = 0;
    virtual void visit(class ir_call *) = 0;
+   virtual void visit(class ir_return *) = 0;
    /*@}*/
 };