summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2010-06-17 19:50:36 -0700
committerIan Romanick <ian.d.romanick@intel.com>2010-06-23 10:56:03 -0700
commit1e8b7a714e8acbb5028a250048452f2efc29d02e (patch)
treeca516071d701a40b691e7ca5035bdef6eb2ce6d3
parent53e48d3f6344964d99be89340343630dbf4175d1 (diff)
ir_constant: Add method to determine if two constants have the same value
-rw-r--r--ir.cpp56
-rw-r--r--ir.h5
2 files changed, 61 insertions, 0 deletions
diff --git a/ir.cpp b/ir.cpp
index d50293d..7fc260d 100644
--- a/ir.cpp
+++ b/ir.cpp
@@ -423,6 +423,62 @@ ir_constant::get_record_field(const char *name)
}
+bool
+ir_constant::has_value(const ir_constant *c) const
+{
+ if (this->type != c->type)
+ return false;
+
+ /* FINISHME: This will probably also handle constant arrays as soon as those
+ * FINISHME: are supported.
+ */
+ if (this->type->base_type == GLSL_TYPE_STRUCT) {
+ const exec_node *a_node = this->components.head;
+ const exec_node *b_node = c->components.head;
+
+ while (!a_node->is_tail_sentinal()) {
+ assert(!b_node->is_tail_sentinal());
+
+ const ir_constant *const a_field = (ir_constant *) a_node;
+ const ir_constant *const b_field = (ir_constant *) b_node;
+
+ if (!a_field->has_value(b_field))
+ return false;
+
+ a_node = a_node->next;
+ b_node = b_node->next;
+ }
+
+ return true;
+ }
+
+ for (unsigned i = 0; i < this->type->components(); i++) {
+ switch (this->type->base_type) {
+ case GLSL_TYPE_UINT:
+ if (this->value.u[i] != c->value.u[i])
+ return false;
+ break;
+ case GLSL_TYPE_INT:
+ if (this->value.i[i] != c->value.i[i])
+ return false;
+ break;
+ case GLSL_TYPE_FLOAT:
+ if (this->value.f[i] != c->value.f[i])
+ return false;
+ break;
+ case GLSL_TYPE_BOOL:
+ if (this->value.b[i] != c->value.b[i])
+ return false;
+ break;
+ default:
+ assert(!"Should not get here.");
+ return false;
+ }
+ }
+
+ return true;
+}
+
ir_dereference_variable::ir_dereference_variable(ir_variable *var)
{
this->var = var;
diff --git a/ir.h b/ir.h
index d02f3ca..a04b688 100644
--- a/ir.h
+++ b/ir.h
@@ -1092,6 +1092,11 @@ public:
ir_constant *get_record_field(const char *name);
/**
+ * Determine whether a constant has the same value as another constant
+ */
+ bool has_value(const ir_constant *) const;
+
+ /**
* Value of the constant.
*
* The field used to back the values supplied by the constant is determined