diff --git a/BUILD.gn b/BUILD.gn
index fa98013..1c9efe9 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1045,6 +1045,7 @@
     "src/writer/hlsl/generator_impl_binary_test.cc",
     "src/writer/hlsl/generator_impl_break_test.cc",
     "src/writer/hlsl/generator_impl_case_test.cc",
+    "src/writer/hlsl/generator_impl_constructor_test.cc",
     "src/writer/hlsl/generator_impl_continue_test.cc",
     "src/writer/hlsl/generator_impl_identifier_test.cc",
     "src/writer/hlsl/generator_impl_return_test.cc",
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 43932c3..21ac83c 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -553,6 +553,7 @@
     writer/hlsl/generator_impl_binary_test.cc
     writer/hlsl/generator_impl_break_test.cc
     writer/hlsl/generator_impl_case_test.cc
+    writer/hlsl/generator_impl_constructor_test.cc
     writer/hlsl/generator_impl_continue_test.cc
     writer/hlsl/generator_impl_identifier_test.cc
     writer/hlsl/generator_impl_return_test.cc
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index 9807979..2eb0a18 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -233,6 +233,56 @@
   return true;
 }
 
+bool GeneratorImpl::EmitConstructor(ast::ConstructorExpression* expr) {
+  if (expr->IsScalarConstructor()) {
+    return EmitScalarConstructor(expr->AsScalarConstructor());
+  }
+  return EmitTypeConstructor(expr->AsTypeConstructor());
+}
+
+bool GeneratorImpl::EmitScalarConstructor(
+    ast::ScalarConstructorExpression* expr) {
+  return EmitLiteral(expr->literal());
+}
+
+bool GeneratorImpl::EmitTypeConstructor(ast::TypeConstructorExpression* expr) {
+  if (expr->type()->IsArray()) {
+    out_ << "{";
+  } else {
+    if (!EmitType(expr->type(), "")) {
+      return false;
+    }
+    out_ << "(";
+  }
+
+  // If the type constructor is empty then we need to construct with the zero
+  // value for all components.
+  if (expr->values().empty()) {
+    if (!EmitZeroValue(expr->type())) {
+      return false;
+    }
+  } else {
+    bool first = true;
+    for (const auto& e : expr->values()) {
+      if (!first) {
+        out_ << ", ";
+      }
+      first = false;
+
+      if (!EmitExpression(e.get())) {
+        return false;
+      }
+    }
+  }
+
+  if (expr->type()->IsArray()) {
+    out_ << "}";
+  } else {
+    out_ << ")";
+  }
+  return true;
+}
+
 bool GeneratorImpl::EmitContinue(ast::ContinueStatement*) {
   make_indent();
   out_ << "continue;" << std::endl;
@@ -243,6 +293,9 @@
   if (expr->IsBinary()) {
     return EmitBinary(expr->AsBinary());
   }
+  if (expr->IsConstructor()) {
+    return EmitConstructor(expr->AsConstructor());
+  }
   if (expr->IsIdentifier()) {
     return EmitIdentifier(expr->AsIdentifier());
   }
@@ -310,6 +363,24 @@
   return true;
 }
 
+bool GeneratorImpl::EmitZeroValue(ast::type::Type* type) {
+  if (type->IsBool()) {
+    out_ << "false";
+  } else if (type->IsF32()) {
+    out_ << "0.0f";
+  } else if (type->IsI32()) {
+    out_ << "0";
+  } else if (type->IsU32()) {
+    out_ << "0u";
+  } else if (type->IsVector()) {
+    return EmitZeroValue(type->AsVector()->type());
+  } else {
+    error_ = "Invalid type for zero emission: " + type->type_name();
+    return false;
+  }
+  return true;
+}
+
 bool GeneratorImpl::EmitReturn(ast::ReturnStatement* stmt) {
   make_indent();
 
diff --git a/src/writer/hlsl/generator_impl.h b/src/writer/hlsl/generator_impl.h
index 896bf30..52cf3bb 100644
--- a/src/writer/hlsl/generator_impl.h
+++ b/src/writer/hlsl/generator_impl.h
@@ -17,6 +17,8 @@
 
 #include "src/ast/literal.h"
 #include "src/ast/module.h"
+#include "src/ast/scalar_constructor_expression.h"
+#include "src/ast/type_constructor_expression.h"
 #include "src/scope_stack.h"
 #include "src/writer/hlsl/namer.h"
 #include "src/writer/text_generator.h"
@@ -52,6 +54,18 @@
   /// @param stmt the statement
   /// @returns true if the statment was emitted successfully
   bool EmitCase(ast::CaseStatement* stmt);
+  /// Handles generating constructor expressions
+  /// @param expr the constructor expression
+  /// @returns true if the expression was emitted
+  bool EmitConstructor(ast::ConstructorExpression* expr);
+  /// Handles generating a scalar constructor
+  /// @param expr the scalar constructor expression
+  /// @returns true if the scalar constructor is emitted
+  bool EmitScalarConstructor(ast::ScalarConstructorExpression* expr);
+  /// Handles emitting a type constructor
+  /// @param expr the type constructor expression
+  /// @returns true if the constructor is emitted
+  bool EmitTypeConstructor(ast::TypeConstructorExpression* expr);
   /// Handles a continue statement
   /// @param stmt the statement to emit
   /// @returns true if the statement was emitted successfully
@@ -89,6 +103,10 @@
   /// @param expr the expression to emit
   /// @returns true if the expression was emitted
   bool EmitUnaryOp(ast::UnaryOpExpression* expr);
+  /// Emits the zero value for the given type
+  /// @param type the type to emit the value for
+  /// @returns true if the zero value was successfully emitted.
+  bool EmitZeroValue(ast::type::Type* type);
 
   /// Checks if the global variable is in an input or output struct
   /// @param var the variable to check
diff --git a/src/writer/hlsl/generator_impl_constructor_test.cc b/src/writer/hlsl/generator_impl_constructor_test.cc
new file mode 100644
index 0000000..b269bfd
--- /dev/null
+++ b/src/writer/hlsl/generator_impl_constructor_test.cc
@@ -0,0 +1,273 @@
+// Copyright 2020 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "gtest/gtest.h"
+#include "src/ast/bool_literal.h"
+#include "src/ast/float_literal.h"
+#include "src/ast/module.h"
+#include "src/ast/scalar_constructor_expression.h"
+#include "src/ast/sint_literal.h"
+#include "src/ast/type/array_type.h"
+#include "src/ast/type/bool_type.h"
+#include "src/ast/type/f32_type.h"
+#include "src/ast/type/i32_type.h"
+#include "src/ast/type/matrix_type.h"
+#include "src/ast/type/u32_type.h"
+#include "src/ast/type/vector_type.h"
+#include "src/ast/type_constructor_expression.h"
+#include "src/ast/uint_literal.h"
+#include "src/writer/hlsl/generator_impl.h"
+
+namespace tint {
+namespace writer {
+namespace hlsl {
+namespace {
+
+using HlslGeneratorImplTest = testing::Test;
+
+TEST_F(HlslGeneratorImplTest, EmitConstructor_Bool) {
+  ast::type::BoolType bool_type;
+  auto lit = std::make_unique<ast::BoolLiteral>(&bool_type, false);
+  ast::ScalarConstructorExpression expr(std::move(lit));
+
+  ast::Module m;
+  GeneratorImpl g(&m);
+  ASSERT_TRUE(g.EmitConstructor(&expr)) << g.error();
+  EXPECT_EQ(g.result(), "false");
+}
+
+TEST_F(HlslGeneratorImplTest, EmitConstructor_Int) {
+  ast::type::I32Type i32;
+  auto lit = std::make_unique<ast::SintLiteral>(&i32, -12345);
+  ast::ScalarConstructorExpression expr(std::move(lit));
+
+  ast::Module m;
+  GeneratorImpl g(&m);
+  ASSERT_TRUE(g.EmitConstructor(&expr)) << g.error();
+  EXPECT_EQ(g.result(), "-12345");
+}
+
+TEST_F(HlslGeneratorImplTest, EmitConstructor_UInt) {
+  ast::type::U32Type u32;
+  auto lit = std::make_unique<ast::UintLiteral>(&u32, 56779);
+  ast::ScalarConstructorExpression expr(std::move(lit));
+
+  ast::Module m;
+  GeneratorImpl g(&m);
+  ASSERT_TRUE(g.EmitConstructor(&expr)) << g.error();
+  EXPECT_EQ(g.result(), "56779u");
+}
+
+TEST_F(HlslGeneratorImplTest, EmitConstructor_Float) {
+  ast::type::F32Type f32;
+  auto lit = std::make_unique<ast::FloatLiteral>(&f32, 1.5e27);
+  ast::ScalarConstructorExpression expr(std::move(lit));
+
+  ast::Module m;
+  GeneratorImpl g(&m);
+  ASSERT_TRUE(g.EmitConstructor(&expr)) << g.error();
+  EXPECT_EQ(g.result(), "1.49999995e+27f");
+}
+
+TEST_F(HlslGeneratorImplTest, EmitConstructor_Type_Float) {
+  ast::type::F32Type f32;
+
+  auto lit = std::make_unique<ast::FloatLiteral>(&f32, -1.2e-5);
+  ast::ExpressionList values;
+  values.push_back(
+      std::make_unique<ast::ScalarConstructorExpression>(std::move(lit)));
+
+  ast::TypeConstructorExpression expr(&f32, std::move(values));
+
+  ast::Module m;
+  GeneratorImpl g(&m);
+  ASSERT_TRUE(g.EmitConstructor(&expr)) << g.error();
+  EXPECT_EQ(g.result(), "float(-1.20000004e-05f)");
+}
+
+TEST_F(HlslGeneratorImplTest, EmitConstructor_Type_Bool) {
+  ast::type::BoolType b;
+
+  auto lit = std::make_unique<ast::BoolLiteral>(&b, true);
+  ast::ExpressionList values;
+  values.push_back(
+      std::make_unique<ast::ScalarConstructorExpression>(std::move(lit)));
+
+  ast::TypeConstructorExpression expr(&b, std::move(values));
+
+  ast::Module m;
+  GeneratorImpl g(&m);
+  ASSERT_TRUE(g.EmitConstructor(&expr)) << g.error();
+  EXPECT_EQ(g.result(), "bool(true)");
+}
+
+TEST_F(HlslGeneratorImplTest, EmitConstructor_Type_Int) {
+  ast::type::I32Type i32;
+
+  auto lit = std::make_unique<ast::SintLiteral>(&i32, -12345);
+  ast::ExpressionList values;
+  values.push_back(
+      std::make_unique<ast::ScalarConstructorExpression>(std::move(lit)));
+
+  ast::TypeConstructorExpression expr(&i32, std::move(values));
+
+  ast::Module m;
+  GeneratorImpl g(&m);
+  ASSERT_TRUE(g.EmitConstructor(&expr)) << g.error();
+  EXPECT_EQ(g.result(), "int(-12345)");
+}
+
+TEST_F(HlslGeneratorImplTest, EmitConstructor_Type_Uint) {
+  ast::type::U32Type u32;
+
+  auto lit = std::make_unique<ast::UintLiteral>(&u32, 12345);
+  ast::ExpressionList values;
+  values.push_back(
+      std::make_unique<ast::ScalarConstructorExpression>(std::move(lit)));
+
+  ast::TypeConstructorExpression expr(&u32, std::move(values));
+
+  ast::Module m;
+  GeneratorImpl g(&m);
+  ASSERT_TRUE(g.EmitConstructor(&expr)) << g.error();
+  EXPECT_EQ(g.result(), "uint(12345u)");
+}
+
+TEST_F(HlslGeneratorImplTest, EmitConstructor_Type_Vec) {
+  ast::type::F32Type f32;
+  ast::type::VectorType vec(&f32, 3);
+
+  auto lit1 = std::make_unique<ast::FloatLiteral>(&f32, 1.f);
+  auto lit2 = std::make_unique<ast::FloatLiteral>(&f32, 2.f);
+  auto lit3 = std::make_unique<ast::FloatLiteral>(&f32, 3.f);
+  ast::ExpressionList values;
+  values.push_back(
+      std::make_unique<ast::ScalarConstructorExpression>(std::move(lit1)));
+  values.push_back(
+      std::make_unique<ast::ScalarConstructorExpression>(std::move(lit2)));
+  values.push_back(
+      std::make_unique<ast::ScalarConstructorExpression>(std::move(lit3)));
+
+  ast::TypeConstructorExpression expr(&vec, std::move(values));
+
+  ast::Module m;
+  GeneratorImpl g(&m);
+  ASSERT_TRUE(g.EmitConstructor(&expr)) << g.error();
+  EXPECT_EQ(g.result(),
+            "vector<float, 3>(1.00000000f, 2.00000000f, 3.00000000f)");
+}
+
+TEST_F(HlslGeneratorImplTest, EmitConstructor_Type_Vec_Empty) {
+  ast::type::F32Type f32;
+  ast::type::VectorType vec(&f32, 3);
+
+  ast::ExpressionList values;
+  ast::TypeConstructorExpression expr(&vec, std::move(values));
+
+  ast::Module m;
+  GeneratorImpl g(&m);
+  ASSERT_TRUE(g.EmitConstructor(&expr)) << g.error();
+  EXPECT_EQ(g.result(), "vector<float, 3>(0.0f)");
+}
+
+TEST_F(HlslGeneratorImplTest, EmitConstructor_Type_Mat) {
+  ast::type::F32Type f32;
+  ast::type::MatrixType mat(&f32, 3, 2);  // 3 ROWS, 2 COLUMNS
+  ast::type::VectorType vec(&f32, 3);
+
+  // WGSL matrix is mat2x3 (it flips for AST, sigh). With a type constructor
+  // of <vec3, vec3>
+
+  ast::ExpressionList mat_values;
+
+  for (size_t i = 0; i < 2; i++) {
+    auto lit1 = std::make_unique<ast::FloatLiteral>(
+        &f32, static_cast<float>(1 + (i * 2)));
+    auto lit2 = std::make_unique<ast::FloatLiteral>(
+        &f32, static_cast<float>(2 + (i * 2)));
+    auto lit3 = std::make_unique<ast::FloatLiteral>(
+        &f32, static_cast<float>(3 + (i * 2)));
+
+    ast::ExpressionList values;
+    values.push_back(
+        std::make_unique<ast::ScalarConstructorExpression>(std::move(lit1)));
+    values.push_back(
+        std::make_unique<ast::ScalarConstructorExpression>(std::move(lit2)));
+    values.push_back(
+        std::make_unique<ast::ScalarConstructorExpression>(std::move(lit3)));
+
+    mat_values.push_back(std::make_unique<ast::TypeConstructorExpression>(
+        &vec, std::move(values)));
+  }
+
+  ast::TypeConstructorExpression expr(&mat, std::move(mat_values));
+
+  ast::Module m;
+  GeneratorImpl g(&m);
+  ASSERT_TRUE(g.EmitConstructor(&expr)) << g.error();
+
+  // A matrix of type T with n columns and m rows can also be constructed from
+  // n vectors of type T with m components.
+  EXPECT_EQ(g.result(),
+            std::string("matrix<float, 3, 2>(vector<float, 3>(1.00000000f, "
+                        "2.00000000f, 3.00000000f), ") +
+                "vector<float, 3>(3.00000000f, 4.00000000f, 5.00000000f))");
+}
+
+TEST_F(HlslGeneratorImplTest, EmitConstructor_Type_Array) {
+  ast::type::F32Type f32;
+  ast::type::VectorType vec(&f32, 3);
+  ast::type::ArrayType ary(&vec, 3);
+
+  ast::ExpressionList ary_values;
+
+  for (size_t i = 0; i < 3; i++) {
+    auto lit1 = std::make_unique<ast::FloatLiteral>(
+        &f32, static_cast<float>(1 + (i * 3)));
+    auto lit2 = std::make_unique<ast::FloatLiteral>(
+        &f32, static_cast<float>(2 + (i * 3)));
+    auto lit3 = std::make_unique<ast::FloatLiteral>(
+        &f32, static_cast<float>(3 + (i * 3)));
+
+    ast::ExpressionList values;
+    values.push_back(
+        std::make_unique<ast::ScalarConstructorExpression>(std::move(lit1)));
+    values.push_back(
+        std::make_unique<ast::ScalarConstructorExpression>(std::move(lit2)));
+    values.push_back(
+        std::make_unique<ast::ScalarConstructorExpression>(std::move(lit3)));
+
+    ary_values.push_back(std::make_unique<ast::TypeConstructorExpression>(
+        &vec, std::move(values)));
+  }
+
+  ast::TypeConstructorExpression expr(&ary, std::move(ary_values));
+
+  ast::Module m;
+  GeneratorImpl g(&m);
+  ASSERT_TRUE(g.EmitConstructor(&expr)) << g.error();
+  EXPECT_EQ(g.result(),
+            std::string("{") +
+                "vector<float, 3>(1.00000000f, 2.00000000f, 3.00000000f), " +
+                "vector<float, 3>(4.00000000f, 5.00000000f, 6.00000000f), " +
+                "vector<float, 3>(7.00000000f, 8.00000000f, 9.00000000f)}");
+}
+
+// TODO(dsinclair): Add struct constructor test.
+TEST_F(HlslGeneratorImplTest, DISABLED_EmitConstructor_Type_Struct) {}
+
+}  // namespace
+}  // namespace hlsl
+}  // namespace writer
+}  // namespace tint
