From 1288f6d405768f57bf2d2fd5914c5a20f902f5d6 Mon Sep 17 00:00:00 2001 From: Timm Baeder Date: Mon, 2 Dec 2024 15:28:26 +0100 Subject: [PATCH] [clang][bytecode] Implement __builtin_reduce_or (#118292) --- clang/lib/AST/ByteCode/InterpBuiltin.cpp | 7 ++++++- clang/test/AST/ByteCode/builtin-functions.cpp | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp index a4e1126bbfa8ae..65fd1538595e5f 100644 --- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp +++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp @@ -104,6 +104,8 @@ template static void pushInteger(InterpState &S, T Val, QualType QT) { if constexpr (std::is_same_v) pushInteger(S, APSInt(Val, !std::is_signed_v), QT); + else if constexpr (std::is_same_v) + pushInteger(S, Val, QT); else pushInteger(S, APSInt(APInt(sizeof(T) * 8, static_cast(Val), @@ -1726,11 +1728,13 @@ static bool interp__builtin_vector_reduce(InterpState &S, CodePtr OpPC, } else if (ID == Builtin::BI__builtin_reduce_and) { (void)T::bitAnd(Result, Elem, BitWidth, &Result); + } else if (ID == Builtin::BI__builtin_reduce_or) { + (void)T::bitOr(Result, Elem, BitWidth, &Result); } else { llvm_unreachable("Unhandled vector reduce builtin"); } } - pushInteger(S, Result, Call->getType()); + pushInteger(S, Result.toAPSInt(), Call->getType()); }); return true; @@ -2210,6 +2214,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: + case Builtin::BI__builtin_reduce_or: 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 8f56dcca852be0..81fed29a8c6c0f 100644 --- a/clang/test/AST/ByteCode/builtin-functions.cpp +++ b/clang/test/AST/ByteCode/builtin-functions.cpp @@ -1080,6 +1080,22 @@ namespace ReduceAnd { #endif } +namespace ReduceOr { + static_assert(__builtin_reduce_or((vector4char){}) == 0); + static_assert(__builtin_reduce_or((vector4char){(char)0x11, (char)0x22, (char)0x44, (char)0x88}) == (char)0xFF); + static_assert(__builtin_reduce_or((vector4short){(short)0x1111, (short)0x2222, (short)0x4444, (short)0x8888}) == (short)0xFFFF); + static_assert(__builtin_reduce_or((vector4int){(int)0x11111111, (int)0x22222222, (int)0x44444444, (int)0x88888888}) == (int)0xFFFFFFFF); +#if __INT_WIDTH__ == 32 + static_assert(__builtin_reduce_or((vector4long){(long long)0x1111111111111111L, (long long)0x2222222222222222L, (long long)0x4444444444444444L, (long long)0x8888888888888888L}) == (long long)0xFFFFFFFFFFFFFFFFL); + static_assert(__builtin_reduce_or((vector4char){(char)0, (char)0x22, (char)0x44, (char)0x88}) == ~0x11); + static_assert(__builtin_reduce_or((vector4short){(short)0x1111, (short)0, (short)0x4444, (short)0x8888}) == ~0x2222); + static_assert(__builtin_reduce_or((vector4int){(int)0x11111111, (int)0x22222222, (int)0, (int)0x88888888}) == ~0x44444444); + static_assert(__builtin_reduce_or((vector4long){(long long)0x1111111111111111L, (long long)0x2222222222222222L, (long long)0x4444444444444444L, (long long)0}) == ~0x8888888888888888L); + static_assert(__builtin_reduce_or((vector4uint){0x11111111U, 0x22222222U, 0x44444444U, 0x88888888U}) == 0xFFFFFFFFU); + static_assert(__builtin_reduce_or((vector4ulong){0x1111111111111111UL, 0x2222222222222222UL, 0x4444444444444444UL, 0x8888888888888888UL}) == 0xFFFFFFFFFFFFFFFFL); +#endif +} + namespace BuiltinMemcpy { constexpr int simple() { int a = 12;