[PATCH] D63575: [WebAssembly] Add builtin functions for creating vector constants

Thomas Lively via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 19 14:44:25 PDT 2019


tlively created this revision.
tlively added reviewers: dschuff, aheejin.
Herald added subscribers: cfe-commits, sunfish, jgravelle-google, sbc100.
Herald added a project: clang.

These builtins do not offer any functionality over the normal
aggregate initialization for vector types, except that they enforce
that their arguments constant fold to integer expressions so they
always generate a vector constant. They are meant for use in the new
WebAssembly SIMD intrinsic header.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D63575

Files:
  clang/include/clang/Basic/BuiltinsWebAssembly.def
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/test/CodeGen/builtins-wasm.c


Index: clang/test/CodeGen/builtins-wasm.c
===================================================================
--- clang/test/CodeGen/builtins-wasm.c
+++ clang/test/CodeGen/builtins-wasm.c
@@ -140,10 +140,29 @@
   // WEBASSEMBLY-NEXT: ret
 }
 
+i8x16 const_i8x16() {
+  // MISSING-SIMD: error: '__builtin_wasm_const_i8x16' needs target feature simd128
+  // WEBASSEMBLY: ret <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>
+  return __builtin_wasm_const_i8x16(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
+}
+
+i16x8 const_i16x8() {
+  // WEBASSEMBLY: ret <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>
+  return __builtin_wasm_const_i16x8(0, 1, 2, 3, 4, 5, 6, 7);
+}
+
+i32x4 const_i32x4() {
+  // WEBASSEMBLY: ret <4 x i32> <i32 0, i32 1, i32 2, i32 3>
+  return __builtin_wasm_const_i32x4(0, 1, 2, 3);
+}
+
+i64x2 const_i64x2() {
+  // WEBASSEMBLY: ret <2 x i64> <i64 0, i64 1>
+  return __builtin_wasm_const_i64x2(0, 1);
+}
 
 int extract_lane_s_i8x16(i8x16 v) {
   return __builtin_wasm_extract_lane_s_i8x16(v, 13);
-  // MISSING-SIMD: error: '__builtin_wasm_extract_lane_s_i8x16' needs target feature simd128
   // WEBASSEMBLY: extractelement <16 x i8> %v, i32 13
   // WEBASSEMBLY-NEXT: sext
   // WEBASSEMBLY-NEXT: ret
Index: clang/lib/CodeGen/CGBuiltin.cpp
===================================================================
--- clang/lib/CodeGen/CGBuiltin.cpp
+++ clang/lib/CodeGen/CGBuiltin.cpp
@@ -13971,6 +13971,19 @@
                                      ConvertType(E->getType()));
     return Builder.CreateCall(Callee, {LHS, RHS});
   }
+  case WebAssembly::BI__builtin_wasm_const_i8x16:
+  case WebAssembly::BI__builtin_wasm_const_i16x8:
+  case WebAssembly::BI__builtin_wasm_const_i32x4:
+  case WebAssembly::BI__builtin_wasm_const_i64x2: {
+    SmallVector<llvm::Constant *, 16> Args;
+    for (size_t i = 0; i < E->getNumArgs(); ++i) {
+      llvm::APSInt Const;
+      if (!E->getArg(i)->isIntegerConstantExpr(Const, getContext()))
+        llvm_unreachable("Constant arg isn't actually constant?");
+      Args.push_back(llvm::ConstantInt::get(getLLVMContext(), Const));
+    }
+    return Builder.Insert(llvm::ConstantVector::get(Args));
+  }
   case WebAssembly::BI__builtin_wasm_extract_lane_s_i8x16:
   case WebAssembly::BI__builtin_wasm_extract_lane_u_i8x16:
   case WebAssembly::BI__builtin_wasm_extract_lane_s_i16x8:
Index: clang/include/clang/Basic/BuiltinsWebAssembly.def
===================================================================
--- clang/include/clang/Basic/BuiltinsWebAssembly.def
+++ clang/include/clang/Basic/BuiltinsWebAssembly.def
@@ -55,6 +55,11 @@
 TARGET_BUILTIN(__builtin_wasm_trunc_saturate_u_i64_f64, "LLid", "nc", "nontrapping-fptoint")
 
 // SIMD builtins
+TARGET_BUILTIN(__builtin_wasm_const_i8x16, "V16cIcIcIcIcIcIcIcIcIcIcIcIcIcIcIcIc", "nc", "simd128")
+TARGET_BUILTIN(__builtin_wasm_const_i16x8, "V8sIsIsIsIsIsIsIsIs", "nc", "simd128")
+TARGET_BUILTIN(__builtin_wasm_const_i32x4, "V4iIiIiIiIi", "nc", "simd128")
+TARGET_BUILTIN(__builtin_wasm_const_i64x2, "V2LLiILLiILLi", "nc", "unimplemented-simd128")
+
 TARGET_BUILTIN(__builtin_wasm_extract_lane_s_i8x16, "iV16cIi", "nc", "simd128")
 TARGET_BUILTIN(__builtin_wasm_extract_lane_u_i8x16, "iV16cIi", "nc", "unimplemented-simd128")
 TARGET_BUILTIN(__builtin_wasm_extract_lane_s_i16x8, "iV8sIi", "nc", "simd128")


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D63575.205679.patch
Type: text/x-patch
Size: 3418 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190619/5fc4a1d7/attachment-0001.bin>


More information about the cfe-commits mailing list