Skip to content

Commit b587b91

Browse files
authored
[clang][bytecode] Implement __builtin_reduce_xor (#118299)
1 parent eae30a2 commit b587b91

File tree

2 files changed

+15
-0
lines changed

2 files changed

+15
-0
lines changed

clang/lib/AST/ByteCode/InterpBuiltin.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1730,6 +1730,8 @@ static bool interp__builtin_vector_reduce(InterpState &S, CodePtr OpPC,
17301730
(void)T::bitAnd(Result, Elem, BitWidth, &Result);
17311731
} else if (ID == Builtin::BI__builtin_reduce_or) {
17321732
(void)T::bitOr(Result, Elem, BitWidth, &Result);
1733+
} else if (ID == Builtin::BI__builtin_reduce_xor) {
1734+
(void)T::bitXor(Result, Elem, BitWidth, &Result);
17331735
} else {
17341736
llvm_unreachable("Unhandled vector reduce builtin");
17351737
}
@@ -2215,6 +2217,7 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const Function *F,
22152217
case Builtin::BI__builtin_reduce_mul:
22162218
case Builtin::BI__builtin_reduce_and:
22172219
case Builtin::BI__builtin_reduce_or:
2220+
case Builtin::BI__builtin_reduce_xor:
22182221
if (!interp__builtin_vector_reduce(S, OpPC, Frame, F, Call))
22192222
return false;
22202223
break;

clang/test/AST/ByteCode/builtin-functions.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,6 +1096,18 @@ namespace ReduceOr {
10961096
#endif
10971097
}
10981098

1099+
namespace ReduceXor {
1100+
static_assert(__builtin_reduce_xor((vector4char){}) == 0);
1101+
static_assert(__builtin_reduce_xor((vector4char){(char)0x11, (char)0x22, (char)0x44, (char)0x88}) == (char)0xFF);
1102+
static_assert(__builtin_reduce_xor((vector4short){(short)0x1111, (short)0x2222, (short)0x4444, (short)0x8888}) == (short)0xFFFF);
1103+
#if __INT_WIDTH__ == 32
1104+
static_assert(__builtin_reduce_xor((vector4int){(int)0x11111111, (int)0x22222222, (int)0x44444444, (int)0x88888888}) == (int)0xFFFFFFFF);
1105+
static_assert(__builtin_reduce_xor((vector4long){(long long)0x1111111111111111L, (long long)0x2222222222222222L, (long long)0x4444444444444444L, (long long)0x8888888888888888L}) == (long long)0xFFFFFFFFFFFFFFFFL);
1106+
static_assert(__builtin_reduce_xor((vector4uint){0x11111111U, 0x22222222U, 0x44444444U, 0x88888888U}) == 0xFFFFFFFFU);
1107+
static_assert(__builtin_reduce_xor((vector4ulong){0x1111111111111111UL, 0x2222222222222222UL, 0x4444444444444444UL, 0x8888888888888888UL}) == 0xFFFFFFFFFFFFFFFFUL);
1108+
#endif
1109+
}
1110+
10991111
namespace BuiltinMemcpy {
11001112
constexpr int simple() {
11011113
int a = 12;

0 commit comments

Comments
 (0)