Skip to content

Commit 95470b6

Browse files
adbox53tbaederr
andauthored
Replace interp__builtin_blend with interp__builtin_ia32_shuffle_gener… (#170217)
Fixes #169994 --------- Co-authored-by: Timm Baeder <tbaeder@redhat.com>
1 parent 7b65219 commit 95470b6

File tree

1 file changed

+9
-34
lines changed

1 file changed

+9
-34
lines changed

clang/lib/AST/ByteCode/InterpBuiltin.cpp

Lines changed: 9 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2875,39 +2875,6 @@ static bool interp__builtin_select_scalar(InterpState &S,
28752875
return true;
28762876
}
28772877

2878-
static bool interp__builtin_blend(InterpState &S, CodePtr OpPC,
2879-
const CallExpr *Call) {
2880-
APSInt Mask = popToAPSInt(S, Call->getArg(2));
2881-
const Pointer &TrueVec = S.Stk.pop<Pointer>();
2882-
const Pointer &FalseVec = S.Stk.pop<Pointer>();
2883-
const Pointer &Dst = S.Stk.peek<Pointer>();
2884-
2885-
assert(FalseVec.getNumElems() == TrueVec.getNumElems());
2886-
assert(FalseVec.getNumElems() == Dst.getNumElems());
2887-
unsigned NumElems = FalseVec.getNumElems();
2888-
PrimType ElemT = FalseVec.getFieldDesc()->getPrimType();
2889-
PrimType DstElemT = Dst.getFieldDesc()->getPrimType();
2890-
2891-
for (unsigned I = 0; I != NumElems; ++I) {
2892-
bool MaskBit = Mask[I % 8];
2893-
if (ElemT == PT_Float) {
2894-
assert(DstElemT == PT_Float);
2895-
Dst.elem<Floating>(I) =
2896-
MaskBit ? TrueVec.elem<Floating>(I) : FalseVec.elem<Floating>(I);
2897-
} else {
2898-
assert(DstElemT == ElemT);
2899-
INT_TYPE_SWITCH_NO_BOOL(DstElemT, {
2900-
Dst.elem<T>(I) =
2901-
static_cast<T>(MaskBit ? TrueVec.elem<T>(I).toAPSInt()
2902-
: FalseVec.elem<T>(I).toAPSInt());
2903-
});
2904-
}
2905-
}
2906-
Dst.initializeAllElements();
2907-
2908-
return true;
2909-
}
2910-
29112878
static bool interp__builtin_ia32_test_op(
29122879
InterpState &S, CodePtr OpPC, const CallExpr *Call,
29132880
llvm::function_ref<bool(const APInt &A, const APInt &B)> Fn) {
@@ -4796,7 +4763,15 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
47964763
case clang::X86::BI__builtin_ia32_pblendw256:
47974764
case clang::X86::BI__builtin_ia32_pblendd128:
47984765
case clang::X86::BI__builtin_ia32_pblendd256:
4799-
return interp__builtin_blend(S, OpPC, Call);
4766+
return interp__builtin_ia32_shuffle_generic(
4767+
S, OpPC, Call, [](unsigned DstIdx, unsigned ShuffleMask) {
4768+
// Bit index for mask.
4769+
unsigned MaskBit = (ShuffleMask >> (DstIdx % 8)) & 0x1;
4770+
unsigned SrcVecIdx = MaskBit ? 1 : 0; // 1 = TrueVec, 0 = FalseVec
4771+
return std::pair<unsigned, int>{SrcVecIdx, static_cast<int>(DstIdx)};
4772+
});
4773+
4774+
48004775

48014776
case clang::X86::BI__builtin_ia32_blendvpd:
48024777
case clang::X86::BI__builtin_ia32_blendvpd256:

0 commit comments

Comments
 (0)