diff --git a/clang/include/clang/Basic/BuiltinsWebAssembly.def b/clang/include/clang/Basic/BuiltinsWebAssembly.def --- a/clang/include/clang/Basic/BuiltinsWebAssembly.def +++ b/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") diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/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 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: diff --git a/clang/test/CodeGen/builtins-wasm.c b/clang/test/CodeGen/builtins-wasm.c --- a/clang/test/CodeGen/builtins-wasm.c +++ b/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> + 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> + return __builtin_wasm_const_i16x8(0, 1, 2, 3, 4, 5, 6, 7); +} + +i32x4 const_i32x4() { + // WEBASSEMBLY: ret <4 x i32> + return __builtin_wasm_const_i32x4(0, 1, 2, 3); +} + +i64x2 const_i64x2() { + // WEBASSEMBLY: ret <2 x i64> + 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