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")
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")
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits