@@ -2683,9 +2683,10 @@ static bool interp__builtin_ia32_pmul(InterpState &S, CodePtr OpPC,
2683
2683
const auto *VT = Call->getArg (0 )->getType ()->castAs <VectorType>();
2684
2684
PrimType ElemT = *S.getContext ().classify (VT->getElementType ());
2685
2685
unsigned SourceLen = VT->getNumElements ();
2686
- SmallVector<APValue, 4 > ResultElements;
2687
- ResultElements.reserve (SourceLen / 2 );
2688
2686
2687
+ PrimType DstElemT = *S.getContext ().classify (
2688
+ Call->getType ()->castAs <VectorType>()->getElementType ());
2689
+ unsigned DstElem = 0 ;
2689
2690
for (unsigned I = 0 ; I != SourceLen; I += 2 ) {
2690
2691
APSInt Elem1;
2691
2692
APSInt Elem2;
@@ -2699,16 +2700,19 @@ static bool interp__builtin_ia32_pmul(InterpState &S, CodePtr OpPC,
2699
2700
case clang::X86::BI__builtin_ia32_pmuludq128:
2700
2701
case clang::X86::BI__builtin_ia32_pmuludq256:
2701
2702
case clang::X86::BI__builtin_ia32_pmuludq512:
2702
- Result = APSInt (llvm::APIntOps::muluExtended (Elem1, Elem2), true );
2703
+ Result = APSInt (llvm::APIntOps::muluExtended (Elem1, Elem2),
2704
+ /* IsUnsigned=*/ true );
2703
2705
break ;
2704
2706
case clang::X86::BI__builtin_ia32_pmuldq128:
2705
2707
case clang::X86::BI__builtin_ia32_pmuldq256:
2706
2708
case clang::X86::BI__builtin_ia32_pmuldq512:
2707
- Result = APSInt (llvm::APIntOps::mulsExtended (Elem1, Elem2), false );
2709
+ Result = APSInt (llvm::APIntOps::mulsExtended (Elem1, Elem2),
2710
+ /* IsUnsigned=*/ false );
2708
2711
break ;
2709
2712
}
2710
- INT_TYPE_SWITCH_NO_BOOL (ElemT,
2711
- { Dst.elem <T>(I) = static_cast <T>(Result); });
2713
+ INT_TYPE_SWITCH_NO_BOOL (DstElemT,
2714
+ { Dst.elem <T>(DstElem) = static_cast <T>(Result); });
2715
+ ++DstElem;
2712
2716
}
2713
2717
2714
2718
Dst.initializeAllElements ();
@@ -3204,6 +3208,7 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
3204
3208
case clang::X86::BI__builtin_ia32_pmuldq512:
3205
3209
case clang::X86::BI__builtin_ia32_pmuludq128:
3206
3210
case clang::X86::BI__builtin_ia32_pmuludq256:
3211
+ case clang::X86::BI__builtin_ia32_pmuludq512:
3207
3212
return interp__builtin_ia32_pmul (S, OpPC, Call, BuiltinID);
3208
3213
case Builtin::BI__builtin_elementwise_fma:
3209
3214
return interp__builtin_elementwise_fma (S, OpPC, Call);
0 commit comments