[clang] b587b91 - [clang][bytecode] Implement __builtin_reduce_xor (#118299)

via cfe-commits cfe-commits at lists.llvm.org
Mon Dec 2 07:04:53 PST 2024


Author: Timm Baeder
Date: 2024-12-02T16:04:49+01:00
New Revision: b587b910d5b6fd27f4730ad933a8465528d6f5be

URL: https://github.com/llvm/llvm-project/commit/b587b910d5b6fd27f4730ad933a8465528d6f5be
DIFF: https://github.com/llvm/llvm-project/commit/b587b910d5b6fd27f4730ad933a8465528d6f5be.diff

LOG: [clang][bytecode] Implement __builtin_reduce_xor (#118299)

Added: 
    

Modified: 
    clang/lib/AST/ByteCode/InterpBuiltin.cpp
    clang/test/AST/ByteCode/builtin-functions.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index 65fd1538595e5f..a217578e4936b4 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -1730,6 +1730,8 @@ static bool interp__builtin_vector_reduce(InterpState &S, CodePtr OpPC,
         (void)T::bitAnd(Result, Elem, BitWidth, &Result);
       } else if (ID == Builtin::BI__builtin_reduce_or) {
         (void)T::bitOr(Result, Elem, BitWidth, &Result);
+      } else if (ID == Builtin::BI__builtin_reduce_xor) {
+        (void)T::bitXor(Result, Elem, BitWidth, &Result);
       } else {
         llvm_unreachable("Unhandled vector reduce builtin");
       }
@@ -2215,6 +2217,7 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const Function *F,
   case Builtin::BI__builtin_reduce_mul:
   case Builtin::BI__builtin_reduce_and:
   case Builtin::BI__builtin_reduce_or:
+  case Builtin::BI__builtin_reduce_xor:
     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 81fed29a8c6c0f..61b78e8928df4c 100644
--- a/clang/test/AST/ByteCode/builtin-functions.cpp
+++ b/clang/test/AST/ByteCode/builtin-functions.cpp
@@ -1096,6 +1096,18 @@ namespace ReduceOr {
 #endif
 }
 
+namespace ReduceXor {
+  static_assert(__builtin_reduce_xor((vector4char){}) == 0);
+  static_assert(__builtin_reduce_xor((vector4char){(char)0x11, (char)0x22, (char)0x44, (char)0x88}) == (char)0xFF);
+  static_assert(__builtin_reduce_xor((vector4short){(short)0x1111, (short)0x2222, (short)0x4444, (short)0x8888}) == (short)0xFFFF);
+#if __INT_WIDTH__ == 32
+  static_assert(__builtin_reduce_xor((vector4int){(int)0x11111111, (int)0x22222222, (int)0x44444444, (int)0x88888888}) == (int)0xFFFFFFFF);
+  static_assert(__builtin_reduce_xor((vector4long){(long long)0x1111111111111111L, (long long)0x2222222222222222L, (long long)0x4444444444444444L, (long long)0x8888888888888888L}) == (long long)0xFFFFFFFFFFFFFFFFL);
+  static_assert(__builtin_reduce_xor((vector4uint){0x11111111U, 0x22222222U, 0x44444444U, 0x88888888U}) == 0xFFFFFFFFU);
+  static_assert(__builtin_reduce_xor((vector4ulong){0x1111111111111111UL, 0x2222222222222222UL, 0x4444444444444444UL, 0x8888888888888888UL}) == 0xFFFFFFFFFFFFFFFFUL);
+#endif
+}
+
 namespace BuiltinMemcpy {
   constexpr int simple() {
     int a = 12;


        


More information about the cfe-commits mailing list