[clang] [Headers][X86] Allow SLLDQ/SRLDQ byte shift intrinsics to be used in constexpr (PR #164166)
Simon Pilgrim via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 22 03:54:45 PDT 2025
================
@@ -4149,6 +4181,42 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
case X86::BI__builtin_ia32_vec_set_v4di:
return interp__builtin_vec_set(S, OpPC, Call, BuiltinID);
+ case X86::BI__builtin_ia32_pslldqi128_byteshift:
+ case X86::BI__builtin_ia32_pslldqi256_byteshift:
+ return interp__builtin_x86_byteshift(
+ S, OpPC, Call, BuiltinID,
+ [](const Pointer &Src, PrimType ElemT, unsigned Lane, unsigned I,
+ unsigned Shift) {
+ APInt v;
+ INT_TYPE_SWITCH_NO_BOOL(ElemT, {
+ if (I < Shift) {
+ v = APInt(sizeof(T) * 8, 0);
+ } else {
+ v = APInt(sizeof(T) * 8,
+ static_cast<uint64_t>(Src.elem<T>(Lane + I - Shift)));
+ }
+ });
+ return v;
+ });
+
+ case X86::BI__builtin_ia32_psrldqi128_byteshift:
+ case X86::BI__builtin_ia32_psrldqi256_byteshift:
+ return interp__builtin_x86_byteshift(
+ S, OpPC, Call, BuiltinID,
+ [](const Pointer &Src, PrimType ElemT, unsigned Lane, unsigned I,
+ unsigned Shift) {
+ APInt v;
+ INT_TYPE_SWITCH_NO_BOOL(ElemT, {
+ if (I + Shift < 16) {
+ v = APInt(sizeof(T) * 8,
+ static_cast<uint64_t>(Src.elem<T>(Lane + I + Shift)));
----------------
RKSimon wrote:
You're hardcoding the lane width to 16 but using "sizeof(T) * 8" even though it will equal 8?
https://github.com/llvm/llvm-project/pull/164166
More information about the cfe-commits
mailing list