From ccb5b2270143acfe107962b86c881fb185b5a285 Mon Sep 17 00:00:00 2001 From: Thomas Lively Date: Fri, 5 Oct 2018 00:59:37 +0000 Subject: [PATCH] [WebAssembly] any_true and all_true builtins Summary: Depends on D52858. Reviewers: aheejin, dschuff, craig.topper Subscribers: sbc100, jgravelle-google, sunfish, kristina, cfe-commits Differential Revision: https://reviews.llvm.org/D52910 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@343837 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/BuiltinsWebAssembly.def | 9 ++++ lib/CodeGen/CGBuiltin.cpp | 29 +++++++++++++ test/CodeGen/builtins-wasm.c | 48 +++++++++++++++++++++ 3 files changed, 86 insertions(+) diff --git a/include/clang/Basic/BuiltinsWebAssembly.def b/include/clang/Basic/BuiltinsWebAssembly.def index 6c968520b8..0303270324 100644 --- a/include/clang/Basic/BuiltinsWebAssembly.def +++ b/include/clang/Basic/BuiltinsWebAssembly.def @@ -66,4 +66,13 @@ BUILTIN(__builtin_wasm_sub_saturate_u_i8x16, "V16cV16cV16c", "nc") BUILTIN(__builtin_wasm_sub_saturate_s_i16x8, "V8sV8sV8s", "nc") BUILTIN(__builtin_wasm_sub_saturate_u_i16x8, "V8sV8sV8s", "nc") +BUILTIN(__builtin_wasm_any_true_i8x16, "iV16c", "nc") +BUILTIN(__builtin_wasm_any_true_i16x8, "iV8s", "nc") +BUILTIN(__builtin_wasm_any_true_i32x4, "iV4i", "nc") +BUILTIN(__builtin_wasm_any_true_i64x2, "iV2LLi", "nc") +BUILTIN(__builtin_wasm_all_true_i8x16, "iV16c", "nc") +BUILTIN(__builtin_wasm_all_true_i16x8, "iV8s", "nc") +BUILTIN(__builtin_wasm_all_true_i32x4, "iV4i", "nc") +BUILTIN(__builtin_wasm_all_true_i64x2, "iV2LLi", "nc") + #undef BUILTIN diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp index 74a5027fc7..57d7d8b46e 100644 --- a/lib/CodeGen/CGBuiltin.cpp +++ b/lib/CodeGen/CGBuiltin.cpp @@ -12536,6 +12536,35 @@ Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID, Value *Callee = CGM.getIntrinsic(IntNo, ConvertType(E->getType())); return Builder.CreateCall(Callee, {LHS, RHS}); } + case WebAssembly::BI__builtin_wasm_any_true_i8x16: + case WebAssembly::BI__builtin_wasm_any_true_i16x8: + case WebAssembly::BI__builtin_wasm_any_true_i32x4: + case WebAssembly::BI__builtin_wasm_any_true_i64x2: + case WebAssembly::BI__builtin_wasm_all_true_i8x16: + case WebAssembly::BI__builtin_wasm_all_true_i16x8: + case WebAssembly::BI__builtin_wasm_all_true_i32x4: + case WebAssembly::BI__builtin_wasm_all_true_i64x2: { + unsigned IntNo; + switch (BuiltinID) { + case WebAssembly::BI__builtin_wasm_any_true_i8x16: + case WebAssembly::BI__builtin_wasm_any_true_i16x8: + case WebAssembly::BI__builtin_wasm_any_true_i32x4: + case WebAssembly::BI__builtin_wasm_any_true_i64x2: + IntNo = Intrinsic::wasm_anytrue; + break; + case WebAssembly::BI__builtin_wasm_all_true_i8x16: + case WebAssembly::BI__builtin_wasm_all_true_i16x8: + case WebAssembly::BI__builtin_wasm_all_true_i32x4: + case WebAssembly::BI__builtin_wasm_all_true_i64x2: + IntNo = Intrinsic::wasm_alltrue; + break; + default: + llvm_unreachable("unexpected builtin ID"); + } + Value *Vec = EmitScalarExpr(E->getArg(0)); + Value *Callee = CGM.getIntrinsic(IntNo, Vec->getType()); + return Builder.CreateCall(Callee, {Vec}); + } default: return nullptr; diff --git a/test/CodeGen/builtins-wasm.c b/test/CodeGen/builtins-wasm.c index 4dc969dc25..f92b80700e 100644 --- a/test/CodeGen/builtins-wasm.c +++ b/test/CodeGen/builtins-wasm.c @@ -228,3 +228,51 @@ i16x8 f32(i16x8 x, i16x8 y) { // WEBASSEMBLY-SAME: <8 x i16> %x, <8 x i16> %y) // WEBASSEMBLY-NEXT: ret } + +int f33(i8x16 x) { + return __builtin_wasm_any_true_i8x16(x); + // WEBASSEMBLY: call i32 @llvm.wasm.anytrue.v16i8(<16 x i8> %x) + // WEBASSEMBLY: ret +} + +int f34(i16x8 x) { + return __builtin_wasm_any_true_i16x8(x); + // WEBASSEMBLY: call i32 @llvm.wasm.anytrue.v8i16(<8 x i16> %x) + // WEBASSEMBLY: ret +} + +int f35(i32x4 x) { + return __builtin_wasm_any_true_i32x4(x); + // WEBASSEMBLY: call i32 @llvm.wasm.anytrue.v4i32(<4 x i32> %x) + // WEBASSEMBLY: ret +} + +int f36(i64x2 x) { + return __builtin_wasm_any_true_i64x2(x); + // WEBASSEMBLY: call i32 @llvm.wasm.anytrue.v2i64(<2 x i64> %x) + // WEBASSEMBLY: ret +} + +int f37(i8x16 x) { + return __builtin_wasm_all_true_i8x16(x); + // WEBASSEMBLY: call i32 @llvm.wasm.alltrue.v16i8(<16 x i8> %x) + // WEBASSEMBLY: ret +} + +int f38(i16x8 x) { + return __builtin_wasm_all_true_i16x8(x); + // WEBASSEMBLY: call i32 @llvm.wasm.alltrue.v8i16(<8 x i16> %x) + // WEBASSEMBLY: ret +} + +int f39(i32x4 x) { + return __builtin_wasm_all_true_i32x4(x); + // WEBASSEMBLY: call i32 @llvm.wasm.alltrue.v4i32(<4 x i32> %x) + // WEBASSEMBLY: ret +} + +int f40(i64x2 x) { + return __builtin_wasm_all_true_i64x2(x); + // WEBASSEMBLY: call i32 @llvm.wasm.alltrue.v2i64(<2 x i64> %x) + // WEBASSEMBLY: ret +} -- 2.40.0