https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/118289
None >From 3b59280cae47010df112ae9aff091e3fc0708686 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com> Date: Mon, 2 Dec 2024 14:03:16 +0100 Subject: [PATCH] [clang][bytecode] Implement __builtin_reduce_and --- clang/lib/AST/ByteCode/InterpBuiltin.cpp | 6 +++++- clang/test/AST/ByteCode/builtin-functions.cpp | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp index b35b90e55e5155..a4e1126bbfa8ae 100644 --- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp +++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp @@ -1700,7 +1700,7 @@ static bool interp__builtin_vector_reduce(InterpState &S, CodePtr OpPC, PrimType ElemT = *S.getContext().classify(ElemType); unsigned NumElems = Arg.getNumElems(); - INT_TYPE_SWITCH(ElemT, { + INT_TYPE_SWITCH_NO_BOOL(ElemT, { T Result = Arg.atIndex(0).deref<T>(); unsigned BitWidth = Result.bitWidth(); for (unsigned I = 1; I != NumElems; ++I) { @@ -1723,6 +1723,9 @@ static bool interp__builtin_vector_reduce(InterpState &S, CodePtr OpPC, Elem.toAPSInt(OverflowBits))); return false; } + + } else if (ID == Builtin::BI__builtin_reduce_and) { + (void)T::bitAnd(Result, Elem, BitWidth, &Result); } else { llvm_unreachable("Unhandled vector reduce builtin"); } @@ -2206,6 +2209,7 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const Function *F, case Builtin::BI__builtin_reduce_add: case Builtin::BI__builtin_reduce_mul: + case Builtin::BI__builtin_reduce_and: if (!interp__builtin_vector_reduce(S, OpPC, Frame, F, Call)) return false; break; diff --git a/clang/test/AST/ByteCode/builtin-functions.cpp b/clang/test/AST/ByteCode/builtin-functions.cpp index e59b7616ac5ab9..1699bb8c3abc2a 100644 --- a/clang/test/AST/ByteCode/builtin-functions.cpp +++ b/clang/test/AST/ByteCode/builtin-functions.cpp @@ -1064,6 +1064,20 @@ namespace ReduceMul { static_assert(__builtin_reduce_mul((vector4ulong){~0ULL, 1, 1, 2}) == ~0ULL - 1); } +namespace ReduceAnd { + static_assert(__builtin_reduce_and((vector4char){}) == 0); + static_assert(__builtin_reduce_and((vector4char){(char)0x11, (char)0x22, (char)0x44, (char)0x88}) == 0); + static_assert(__builtin_reduce_and((vector4short){(short)0x1111, (short)0x2222, (short)0x4444, (short)0x8888}) == 0); + static_assert(__builtin_reduce_and((vector4int){(int)0x11111111, (int)0x22222222, (int)0x44444444, (int)0x88888888}) == 0); + static_assert(__builtin_reduce_and((vector4long){(long long)0x1111111111111111L, (long long)0x2222222222222222L, (long long)0x4444444444444444L, (long long)0x8888888888888888L}) == 0L); + static_assert(__builtin_reduce_and((vector4char){(char)-1, (char)~0x22, (char)~0x44, (char)~0x88}) == 0x11); + static_assert(__builtin_reduce_and((vector4short){(short)~0x1111, (short)-1, (short)~0x4444, (short)~0x8888}) == 0x2222); + static_assert(__builtin_reduce_and((vector4int){(int)~0x11111111, (int)~0x22222222, (int)-1, (int)~0x88888888}) == 0x44444444); + static_assert(__builtin_reduce_and((vector4long){(long long)~0x1111111111111111L, (long long)~0x2222222222222222L, (long long)~0x4444444444444444L, (long long)-1}) == 0x8888888888888888L); + static_assert(__builtin_reduce_and((vector4uint){0x11111111U, 0x22222222U, 0x44444444U, 0x88888888U}) == 0U); + static_assert(__builtin_reduce_and((vector4ulong){0x1111111111111111UL, 0x2222222222222222UL, 0x4444444444444444UL, 0x8888888888888888UL}) == 0L); +} + namespace BuiltinMemcpy { constexpr int simple() { int a = 12; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits