Emit relation expressions.
This CL updates the WGSL writer to emit the relational expressions.
Bug: tint:4
Change-Id: I2b2f5e40f2091ce2b7715773f3811aed7ed61f6a
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/17100
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/writer/wgsl/generator_impl.cc b/src/writer/wgsl/generator_impl.cc
index b282c9e..f60126e 100644
--- a/src/writer/wgsl/generator_impl.cc
+++ b/src/writer/wgsl/generator_impl.cc
@@ -32,6 +32,7 @@
#include "src/ast/int_literal.h"
#include "src/ast/location_decoration.h"
#include "src/ast/member_accessor_expression.h"
+#include "src/ast/relational_expression.h"
#include "src/ast/set_decoration.h"
#include "src/ast/struct.h"
#include "src/ast/struct_member.h"
@@ -140,6 +141,9 @@
if (expr->IsMemberAccessor()) {
return EmitMemberAccessor(expr->AsMemberAccessor());
}
+ if (expr->IsRelational()) {
+ return EmitRelational(expr->AsRelational());
+ }
error_ = "unknown expression type";
return false;
@@ -451,6 +455,86 @@
return true;
}
+bool GeneratorImpl::EmitRelational(ast::RelationalExpression* expr) {
+ out_ << "(";
+
+ if (!EmitExpression(expr->lhs())) {
+ return false;
+ }
+ out_ << " ";
+
+ switch (expr->relation()) {
+ case ast::Relation::kAnd:
+ out_ << "&";
+ break;
+ case ast::Relation::kOr:
+ out_ << "|";
+ break;
+ case ast::Relation::kXor:
+ out_ << "^";
+ break;
+ case ast::Relation::kLogicalAnd:
+ out_ << "&&";
+ break;
+ case ast::Relation::kLogicalOr:
+ out_ << "||";
+ break;
+ case ast::Relation::kEqual:
+ out_ << "==";
+ break;
+ case ast::Relation::kNotEqual:
+ out_ << "!=";
+ break;
+ case ast::Relation::kLessThan:
+ out_ << "<";
+ break;
+ case ast::Relation::kGreaterThan:
+ out_ << ">";
+ break;
+ case ast::Relation::kLessThanEqual:
+ out_ << "<=";
+ break;
+ case ast::Relation::kGreaterThanEqual:
+ out_ << ">=";
+ break;
+ case ast::Relation::kShiftLeft:
+ out_ << "<<";
+ break;
+ case ast::Relation::kShiftRight:
+ out_ << ">>";
+ break;
+ case ast::Relation::kShiftRightArith:
+ out_ << ">>>";
+ break;
+ case ast::Relation::kAdd:
+ out_ << "+";
+ break;
+ case ast::Relation::kSubtract:
+ out_ << "-";
+ break;
+ case ast::Relation::kMultiply:
+ out_ << "*";
+ break;
+ case ast::Relation::kDivide:
+ out_ << "/";
+ break;
+ case ast::Relation::kModulo:
+ out_ << "%";
+ break;
+ case ast::Relation::kNone:
+ error_ = "missing relation type";
+ return false;
+ }
+ out_ << " ";
+
+ if (!EmitExpression(expr->rhs())) {
+ return false;
+ }
+
+ out_ << ")";
+ return true;
+}
+
} // namespace wgsl
} // namespace writer
} // namespace tint