@@ -2855,16 +2855,13 @@ static bool interp__builtin_x86_extract_vector(InterpState &S, CodePtr OpPC,
28552855 unsigned ID) {
28562856 assert (Call->getNumArgs () == 2 );
28572857
2858- // srcimm
28592858 APSInt ImmAPS = popToAPSInt (S, Call->getArg (1 ));
28602859 uint64_t Index = ImmAPS.getZExtValue ();
28612860
2862- // srcvec
28632861 const Pointer &Src = S.Stk .pop <Pointer>();
28642862 if (!Src.getFieldDesc ()->isPrimitiveArray ())
28652863 return false ;
28662864
2867- // destination (return value)
28682865 const Pointer &Dst = S.Stk .peek <Pointer>();
28692866 if (!Dst.getFieldDesc ()->isPrimitiveArray ())
28702867 return false ;
@@ -2879,12 +2876,11 @@ static bool interp__builtin_x86_extract_vector(InterpState &S, CodePtr OpPC,
28792876 unsigned Lane = static_cast <unsigned >(Index % NumLanes);
28802877 unsigned ExtractPos = Lane * DstElems;
28812878
2882- // element type
2883- PrimType ElemPT = Src.getFieldDesc ()->getPrimType ();
2884- if (ElemPT != Dst.getFieldDesc ()->getPrimType ())
2879+ PrimType ElemT = Src.getFieldDesc ()->getPrimType ();
2880+ if (ElemT != Dst.getFieldDesc ()->getPrimType ())
28852881 return false ;
28862882
2887- TYPE_SWITCH (ElemPT , {
2883+ TYPE_SWITCH (ElemT , {
28882884 for (unsigned I = 0 ; I != DstElems; ++I) {
28892885 Dst.elem <T>(I) = Src.elem <T>(ExtractPos + I);
28902886 }
@@ -2899,41 +2895,40 @@ static bool interp__builtin_x86_extract_vector_masked(InterpState &S, CodePtr Op
28992895 unsigned ID) {
29002896 assert (Call->getNumArgs () == 4 );
29012897
2902- APSInt UAPS = popToAPSInt (S, Call->getArg (3 ));
2903- const Pointer &W = S.Stk .pop <Pointer>();
2898+ APSInt MaskAPS = popToAPSInt (S, Call->getArg (3 ));
2899+ const Pointer &Merge = S.Stk .pop <Pointer>();
29042900 APSInt ImmAPS = popToAPSInt (S, Call->getArg (1 ));
2905- const Pointer &A = S.Stk .pop <Pointer>();
2901+ const Pointer &Src = S.Stk .pop <Pointer>();
29062902
2907- if (!A .getFieldDesc ()->isPrimitiveArray () || !W .getFieldDesc ()->isPrimitiveArray ())
2903+ if (!Src .getFieldDesc ()->isPrimitiveArray () || !Merge .getFieldDesc ()->isPrimitiveArray ())
29082904 return false ;
29092905
29102906 const Pointer &Dst = S.Stk .peek <Pointer>();
29112907 if (!Dst.getFieldDesc ()->isPrimitiveArray ())
29122908 return false ;
29132909
2914- unsigned SrcElems = A .getNumElems ();
2910+ unsigned SrcElems = Src .getNumElems ();
29152911 unsigned DstElems = Dst.getNumElems ();
29162912 if (!SrcElems || !DstElems || (SrcElems % DstElems) != 0 )
29172913 return false ;
29182914
2919- // 타입 일치 체크
2920- PrimType PT = A.getFieldDesc ()->getPrimType ();
2921- if (PT != Dst.getFieldDesc ()->getPrimType () ||
2922- PT != W.getFieldDesc ()->getPrimType ())
2915+ PrimType ElemT = Src.getFieldDesc ()->getPrimType ();
2916+ if (ElemT != Dst.getFieldDesc ()->getPrimType () ||
2917+ ElemT != Merge.getFieldDesc ()->getPrimType ())
29232918 return false ;
29242919
2925- unsigned numLanes = SrcElems / DstElems;
2926- unsigned lane = static_cast <unsigned >(ImmAPS.getZExtValue () % numLanes );
2927- unsigned base = lane * DstElems;
2920+ unsigned NumLanes = SrcElems / DstElems;
2921+ unsigned Lane = static_cast <unsigned >(ImmAPS.getZExtValue () % NumLanes );
2922+ unsigned Base = Lane * DstElems;
29282923
2929- uint64_t U = UAPS .getZExtValue ();
2924+ uint64_t Mask = MaskAPS .getZExtValue ();
29302925
2931- TYPE_SWITCH (PT , {
2932- for (unsigned i = 0 ; i < DstElems; ++i ) {
2933- if ((U >> i ) & 1 )
2934- Dst.elem <T>(i ) = A .elem <T>(base + i );
2926+ TYPE_SWITCH (ElemT , {
2927+ for (unsigned I = 0 ; I < DstElems; ++I ) {
2928+ if ((Mask >> I ) & 1 )
2929+ Dst.elem <T>(I ) = Src .elem <T>(Base + I );
29352930 else
2936- Dst.elem <T>(i ) = W .elem <T>(i );
2931+ Dst.elem <T>(I ) = Merge .elem <T>(I );
29372932 }
29382933 });
29392934
0 commit comments