mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
[msan] Handle x86 vector pack intrinsics.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210020 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1944,6 +1944,28 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
|
||||
setOriginForNaryOp(I);
|
||||
}
|
||||
|
||||
// \brief Instrument vector shift instrinsic.
|
||||
//
|
||||
// This function instruments intrinsics like x86_mmx_packsswb, that
|
||||
// packs elements of 2 input vectors into half as much bits with saturation.
|
||||
// Shadow is propagated with the same intrinsic applied to
|
||||
// sext(Sa != zeroinitializer), sext(Sb != zeroinitializer).
|
||||
void handleVectorPackIntrinsic(IntrinsicInst &I) {
|
||||
assert(I.getNumArgOperands() == 2);
|
||||
IRBuilder<> IRB(&I);
|
||||
Value *S1 = getShadow(&I, 0);
|
||||
Value *S2 = getShadow(&I, 1);
|
||||
Type *T = S1->getType();
|
||||
Value *S1_ext = IRB.CreateSExt(
|
||||
IRB.CreateICmpNE(S1, llvm::Constant::getNullValue(T)), T);
|
||||
Value *S2_ext = IRB.CreateSExt(
|
||||
IRB.CreateICmpNE(S2, llvm::Constant::getNullValue(T)), T);
|
||||
Value *S = IRB.CreateCall2(I.getCalledValue(), S1_ext, S2_ext,
|
||||
"_msprop_vector_pack");
|
||||
setShadow(&I, S);
|
||||
setOriginForNaryOp(I);
|
||||
}
|
||||
|
||||
void visitIntrinsicInst(IntrinsicInst &I) {
|
||||
switch (I.getIntrinsicID()) {
|
||||
case llvm::Intrinsic::bswap:
|
||||
@@ -2060,6 +2082,20 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
|
||||
// case llvm::Intrinsic::x86_sse2_psll_dq_bs:
|
||||
// case llvm::Intrinsic::x86_sse2_psrl_dq_bs:
|
||||
|
||||
case llvm::Intrinsic::x86_sse2_packsswb_128:
|
||||
case llvm::Intrinsic::x86_sse2_packssdw_128:
|
||||
case llvm::Intrinsic::x86_sse2_packuswb_128:
|
||||
case llvm::Intrinsic::x86_sse41_packusdw:
|
||||
case llvm::Intrinsic::x86_avx2_packsswb:
|
||||
case llvm::Intrinsic::x86_avx2_packssdw:
|
||||
case llvm::Intrinsic::x86_avx2_packuswb:
|
||||
case llvm::Intrinsic::x86_avx2_packusdw:
|
||||
case llvm::Intrinsic::x86_mmx_packsswb:
|
||||
case llvm::Intrinsic::x86_mmx_packssdw:
|
||||
case llvm::Intrinsic::x86_mmx_packuswb:
|
||||
handleVectorPackIntrinsic(I);
|
||||
break;
|
||||
|
||||
default:
|
||||
if (!handleUnknownIntrinsic(I))
|
||||
visitInstruction(I);
|
||||
|
Reference in New Issue
Block a user