a :jg: @s@ddlZddlZddlZddlZddlZddlmZmZmZddl m Z d+ddZ GdddZ Gd d d e Z Gd d d e ZGd dde ZGddde ZGddde ZGddde ZdZdZdZeeZee eeeededeeeiZeD]@\ZZerejndZedZeedkr>dd edZnedZdZ!e"Z#esdd ed!Z!nFejszd ed"Z!n0ej$sd ed#e#d$<ej%sd ed%e#d&<eD]\Z&Z'e&D]tZ(e#)e(e!Z*e'fZ+e"eee(ed'Z,e-d(e'j.d)ed)ed)e(e+e,Z/e*r$ej0j!e*d*e/e/e1e/j.<qqqdS),N)targetsclear_floatstatusget_floatstatus)__cpu_baseline__FcCsft}|s|o|d@dk}||s$|o.|d@dkO}||s<|oF|d@dkO}||sT|o^|d@dkO}|S)Nr)r)Z divbyzerooverflowZ underflowinvalidallerrretrE/usr/local/lib/python3.9/site-packages/numpy/_core/tests/test_simd.pycheck_floatstatus s rc@seZdZdZdZdZddZddZd#ddZd d Z d d Z d dZ ddZ ddZ ddZddZddZddZddZddZdd Zd!d"ZdS)$ _Test_UtilityNcCst|j|d|jS)z To call NPV intrinsics without the attribute 'npyv' and auto suffixing intrinsics according to class attribute 'sfx' _getattrnpyvsfx)selfattrrrr __getattr__sz_Test_Utility.__getattr__cCst|j|d|jdS)NrZx2r)r intrin_namerrr_x2&sz_Test_Utility._x2FcCsR|dur d}|dur|j}t|||}|r4t|}|rJdd|DSt|S)z[ Create list of consecutive numbers according to number of vector's lanes. NrcSsg|] }|dqS)?r.0xrrr 5z'_Test_Utility._data..)nlanesrangereversed_is_fplistrstartcountreverserngrrr_data)sz_Test_Utility._datacCs|jddkS)Nrurrrrr _is_unsigned8sz_Test_Utility._is_unsignedcCs|jddkS)Nrsr/r0rrr _is_signed;sz_Test_Utility._is_signedcCs|jddkS)Nrfr/r0rrrr&>sz_Test_Utility._is_fpcCst|jddS)Nr)intrr0rrr _scalar_sizeAsz_Test_Utility._scalar_sizecs0|r |S||fdd|DS)Ncsg|]}tt|qSr)minmax)rvZmax_intZmin_intrrr!Ir"z+_Test_Utility._int_clip..)r&_int_max_int_min)rseqrr:r _int_clipDs z_Test_Utility._int_clipcCs4|r dS||dd}|r0|dS|S)Nrr)r& _to_unsignedsetallr3)rZmax_urrrr;Ks z_Test_Utility._int_maxcCs&|r dS|rdS|d S)Nrr)r&r1r;r0rrrr<Ss z_Test_Utility._int_mincCs&t|jd|jddd}|dS)Nsetall_urr?rr)rZ max_unsigrrr _true_maskZsz_Test_Utility._true_maskcCstt|ttfr,t|jd|jdd|S|jdd}|ddkrLd}nd}t|j||dd||SdS) Nload_urnpyv_rbz cvt_u{0}_b{0}zreinterpret_u{0}_{1}) isinstancer'tuplerrr__name__replaceformat)rvectorrZ cvt_intrinrrrr@^s z_Test_Utility._to_unsignedcCstdSNinffloatr0rrr _pinfinityisz_Test_Utility._pinfinitycCs td SrNrPr0rrr _ninfinitylsz_Test_Utility._ninfinitycCstdS)NnanrPr0rrr_nanosz_Test_Utility._nancCs(|j}|dkrt}n |d}d|S)NZbaseline__ ) target_namersplitjoin)rtargetrrr _cpu_featuresrs  z_Test_Utility._cpu_features)NNF)rJ __module__ __qualname__rrrXrrr-r1r3r&r6r>r;r<rCr@rRrSrUr\rrrrrs&  rc@s~eZdZdZddZdddZdd Zd d Zd d ZddZ e j dddge j dddgddgdgdgfddZ dS) _SIMD_BOOLz2 To test all boolean vector types at once cCst|jd|jddS)NZnlanes_urrr0rrr_nlanes~sz_SIMD_BOOL._nlanesNFcs2|t|}|r t|}fdd|DS)Ncsg|]}|drndqS)rrrr true_maskrrr!r"z$_SIMD_BOOL._data..)rCr$r`r%r(rrarr-s  z_SIMD_BOOL._datacCsB|jdd}t|jd|}t|jd|d|}|||S)NrrDZcvt_bZ_u)rrr)rdatalen_strloadcvtrrr_load_bsz_SIMD_BOOL._load_bcCsz|}|jdd}||}||}ddt||D}t|d||}||ksXJddt||D}t|d||}||ksJddt||D} t|d ||} | | ksJt|d |} | |ksJ|jd vrd Sd dt||D} t|d||} | | ksJddt||D}t|d||}||ksDJddt||D}t|d||}||ksvJd S)z Logical operations for boolean types. Test intrinsics: npyv_xor_##SFX, npyv_and_##SFX, npyv_or_##SFX, npyv_not_##SFX, npyv_andc_b8, npvy_orc_b8, nvpy_xnor_b8 Tr+cSsg|]\}}||@qSrrrarGrrrr!r"z5_SIMD_BOOL.test_operators_logical..andcSsg|]\}}||BqSrrrirrrr!r"orcSsg|]\}}||AqSrrrirrrr!r"xornotb8NcSsg|]\}}||@d@qSrrirrrr!r"andccSsg|]\}}||Bd@qSrprrirrrr!r"ZorccSsg|]\}}||Ad@qSrprrirrrr!r"Zxnor)r-rgziprr)rdata_adata_bvdata_avdata_bdata_andvanddata_orvordata_xorvxorvnot data_andcvandcZdata_orcZvorcZ data_xnorZvxnorrrrtest_operators_logicals4        z!_SIMD_BOOL.test_operators_logicalcCsZdd}||jddfD]8}||}||}||}t|}|t|ksJqdS)NcSstddt|dDS)NcSs g|]\}}t|dk|>qS)rr5)rir rrrr!r"z<_SIMD_BOOL.test_tobits....r)sum enumerate)rcrrrr"z(_SIMD_BOOL.test_tobits..Trh)r-rgtobitsbin)rZ data2bitsrcvdataZ data_bitsrZ bin_tobitsrrr test_tobitss  z_SIMD_BOOL.test_tobitsc Cs |jdvrdS|}|jdd}||}||}t|jd|j}|jdkrzddt|t|D}|||}n~|jd krd dd t|d t|D}|||||}nB|jd krd ddt|dt|D}|||||||||}||ksJdS)z Pack multiple vectors into one Test intrinsics: npyv_pack_b8_b16 npyv_pack_b8_b32 npyv_pack_b8_b64 )b16b32b64NTrhZpack_b8_rcSsg|] }|d@qSrprrrrrrr!r"z(_SIMD_BOOL.test_pack..rcSsg|] }|d@qSrprrrrrr!r"rrcSsg|] }|d@qSrprrrrrr!r"r)rr-rgrrr')rrcrdatarZvrdataZ pack_simdZspackZvpackrrr test_packs&       " " z_SIMD_BOOL.test_packintrinanyr rcr?rcCsD|||}t|}t||}||}||}||ks@JdSzX Test intrinsics: npyv_any_##SFX npyv_all_##SFX N)rgr`evalrrrrcrtfuncdesiredsimdrrrtest_operators_crosstests  z#_SIMD_BOOL.test_operators_crosstest)NNF)rJr]r^__doc__r`r-rgrrrpytestmark parametrizerrrrrr_zs + r_c@sBeZdZdZddZddZddZej dgd d d Z d S) _SIMD_INTz2 To test all integer vector types at once c s6|jdvrdS|||j}|j|dd}||||}}t|D]d|fdd|D}||}||ksJ|fdd|D}| |}||ksVJqVtd|D]f|fdd|D}| |} | |ksJ|fd d|D}| |} | |ksJqdS) N)u8s8Trhcsg|] }|>qSrrrrjr*rrr!r"z2_SIMD_INT.test_operators_shift..csg|] }|?qSrrrrrrr!r"rcsg|] }|>qSrrrrrrr!r"csg|] }|?qSrrrrrrr!r") rr-r;r#r<rer$r6shlshrshlishri) rrtrurvrwZ data_shl_arZ data_shr_arrrrrrtest_operators_shifts&      z_SIMD_INT.test_operators_shiftc Cs|jdvrdS|||j}|j|dd}||||}}|ddt||D}|||}||ks|J|ddt||D}| ||}||ksJdS)N)u32s32u64s64TrhcSsg|]\}}||qSrrrirrrr!"r"z>_SIMD_INT.test_arithmetic_subadd_saturated..cSsg|]\}}||qSrrrirrrr!&r") rr-r;r#r<rer>rsaddssubs) rrtrurvrwZ data_addsrZ data_subsrrrr test_arithmetic_subadd_saturateds    z*_SIMD_INT.test_arithmetic_subadd_saturatedc Cs|}||j}||||}}ddt||D}|||}||ksVJddt||D}|||}||ksJdS)NcSsg|]\}}t||qSr)r8rirrrr!/r"z/_SIMD_INT.test_math_max_min..cSsg|]\}}t||qSr)r7rirrrr!3r")r-r#rersr8r7) rrtrurvrwZdata_maxZsimd_maxZdata_minZsimd_minrrrtest_math_max_min*s    z_SIMD_INT.test_math_max_minr))iirdi'cCs@|||}||t|ks&J||t|ks.rcsg|] }|qSrrr_roundrrr!Vr"z/_SIMD_FP32.test_conversions..N) r\rsimd_f64rematchroundrer-subrA round_s32)rfeaturesrv data_roundvroundrrrtest_conversionsGs  z_SIMD_FP32.test_conversionsNrJr]r^rrrrrrrCsrc@seZdZdZddZdS) _SIMD_FP64z' To only test double precision cCsh||}|||d}|||d}ddt|t|D}|||}||ksdJdS)rrgcSsg|] }t|qSr)rrrrrr!gr"z/_SIMD_FP64.test_conversions..N)rer-rrAmulr'r)rrvrwrrrrrr^s  z_SIMD_FP64.test_conversionsNrrrrrrZsrc @s^eZdZdZddZddZddZdd Zej d d e j fd e j fd e jfdefgddZej dgdddZddZddZej dgdddZej dejdfejdfejd fejd!fejd"fejd#fgd$d%Zej dd&d'gej d(ed)d*gd*ed)ged)d+gd+ed)ged)ed)gd,d-gd-d,gd.d-gfd/d0Zd1S)2_SIMD_FPz0 To test all float vector types at once cCs6||gd\}}}|||}|ddt|||D}||||}||ks\J||||}|||}||ksJ||||} |||} | | ksJ||||} | || d} | | ksJt | |||} | dddt |dddks J| dddt |dddks2JdS)NcSsg|]\}}}|||qSrr)rrjrGcrrrr!sr"z2_SIMD_FP.test_arithmetic_fused..r?rrr) rer-addrsZmuladdZmulsubrZnmuladdZnmulsubrrAr'Z muladdsub)rrvrwZvdata_cZ vdata_cx2Zdata_fmafmaZfmsZdata_fmsZnfmaZ data_nfmaZnfmsZ data_nfmsZfmasrrrtest_arithmetic_fusedos"       &z_SIMD_FP.test_arithmetic_fusedc Cs|||}}}|}||}d||f||f||ff}|D]:\}}|g|j} |||} | tj | ddksNJqN|| ||d} | |ksJdS)N)rrTZnan_okr?) rRrSrUr-rer#absrArapproxr) rpinfninfrTrcrZ abs_casescaserZdata_absZvabsrrrtest_abss  z_SIMD_FP.test_absc Cs|||}}}|}||}ddd|f||f||ff}|D]:\}}|g|j} |||} | tj | ddksPJqP|dd|D} ||} | | ksJdS)N)r)rgTrcSsg|]}t|qSr)mathsqrtrrrrr!r"z&_SIMD_FP.test_sqrt..) rRrSrUr-rer#rrArr) rrrrTrcrZ sqrt_casesrrZ data_sqrtrrrr test_sqrts   z_SIMD_FP.test_sqrtc Cs|||}}}|}||}||f||f||ff}|D]:\}}|g|j} |||} | tj | ddksLJqLdd|D} ||} | | ksJdS)NTrcSsg|] }||qSrrrrrrr!r"z(_SIMD_FP.test_square..) rRrSrUr-rer#squarerArr) rrrrTrcrZ square_casesrrZ data_squarerrrr test_squares   z_SIMD_FP.test_squarez intrin, funcceiltruncfloorrintcsp|}t||}|||}}}||f||f||ff}|D]8\}} | g|j} |||} | tj| ddksDJqDtdddD]TdD]J| fddt|jD} fd d| D} || } | | ksJqqd D]4} || |}fd dD} || ksJq|d kr*d }nd}|D]8| ||} | |d} | | ks2Jq2dS)z Test intrinsics: npyv_rint_##SFX npyv_ceil_##SFX npyv_trunc_##SFX npyv_floor##SFX Trri)gggffffffg?g?gffffff?csg|]}|qSrrr)wr rrr!r"z*_SIMD_FP.test_rounding..csg|] }|qSrrrrrrr!r")g/ Cg/ Cg ?Dg _Dcsg|] }|qSrr)rnrrrr!r"r)r)rgпg333333ӿgܿrrN) rrRrSrUr#rArrr$rer@)rrrrrrrTZ round_casesrrrrrcryZ data_szeror)rrr r test_roundings4       z_SIMD_FP.test_roundingr)r8ZmaxpZmaxnr7ZminpZminncs |||}}ddddd|ddd}t|dd}t|d|}t||}|jd}d d gd d gfd d gd d gf|d gd |gfd |g|d gfd d gd d gfd d gd d gff}|D]b\} } || |} || |} || | } || | }|| ksJ|| } || }|| ksJq|s6dS|dkrJd d}n fdd}d fd f|f|fff}|D]\} } || | g|}|| | } ||}|tj | ddksJ| | } | | } | g|j} || | }|tj | ddks|Jq|dS)a Test intrinsics: npyv_max_##sfx npyv_maxp_##sfx npyv_maxn_##sfx npyv_min_##sfx npyv_minp_##sfx npyv_minn_##sfx npyv_reduce_max_##sfx npyv_reduce_maxp_##sfx npyv_reduce_maxn_##sfx npyv_reduce_min_##sfx npyv_reduce_minp_##sfx npyv_reduce_minn_##sfx rr)ZxpnpnnZxnNrrZreduce_rr icSs t|r|St|r|S|SNrisnanrjrGrrrrsz'_SIMD_FP.test_max_min..cst|st|rS|SrrrrTrrrsTr) rRrSrUgetrrr#rerrrA)rrrrZchk_nanrZ reduce_intrinZ hf_nlanesZcasesZop1Zop2rvrwrcrZtest_nanZvdata_abrrr test_max_minsV              z_SIMD_FP.test_max_minc Cs|||}}}|}||}||f|df|dfd|fd|ff}|D]:\}}|g|j} |||} | tj | ddksXJqX|dd|D} ||} | | ksJdS)NrrTrcSsg|] }d|qS)rrrrrrr!7r"z,_SIMD_FP.test_reciprocal..) rRrSrUr-rer#reciprArr) rrrrTrcrZ recip_casesrrZ data_reciprrrrtest_reciprocal,s"   z_SIMD_FP.test_reciprocalcCs,|||}|dg|jks(JdS)zQ Compare Not NaN. Test intrinsics: npyv_notnan_##SFX rN)ZnotnanrArUr#)rZnnanrrrtest_special_cases;sz_SIMD_FP.test_special_casesr)rrrrcCsVt||}tdtdtd fD].}||}t||tdddks"Jq"dS)NrTrOT)r F)rrQrArr)rrrdr9rrrtest_unary_invalid_fpexceptionCs   z'_SIMD_FP.test_unary_invalid_fpexceptionzpy_comp,np_compcmpltcmplecmpgtcmpgecmpeqcmpneqcs|||}}}|fdd}t||}d|f|df||f||f||fdf}|D]f\} } | g|j} | g|j} || } || }||| |}fddt| | D}||ksbJqbdS)Ncsfdd|DS)Ncsg|] }|kqSrrrZlane mask_truerrr![r"zF_SIMD_FP.test_comparison_with_nan..to_bool..rrMrrrto_boolZsz2_SIMD_FP.test_comparison_with_nan..to_boolr)rrcsg|]\}}||qSrrri)py_comprrr!fr"z5_SIMD_FP.test_comparison_with_nan..)rRrSrUrCrr#rArs)rrZnp_comprrrTrrZ cmp_casesZ case_operand1Z case_operand2rtrurvrwZvcmpdata_cmpr)rrrtest_comparison_with_nanNs        z!_SIMD_FP.test_comparison_with_nanrr rcrTrrrrrcCsB|||j}t|}t||}||}||}||ks>JdSrrer#rrrrrrris  z!_SIMD_FP.test_operators_crosstestN)rJr]r^rrrrrrrrrrrrrrrrrroperatorltlegtgeeqnerrQrrrrrrksH . E       rc @seZdZdZddZddZejdddd d gfd dd d d gfgddZ ejdddgddZ ejdddgddZ ejdddd d gfddd d d gfgddZ ejdddgdd Z ejdd!d"gd#d$Zejd%d&d'gd(d)Zd*d+Zd,d-Zd.d/Zd0d1Zejd2ejd3fejd4fejd5fejd6fejd7fgd8d9Zd:d;Zejdgejd?gd@gdAgdBgdCgdDdEgd gdFgfdGdHZdIdJZdKdLZdMdNZdOdPZ dQdRZ!dSdTZ"dUdVZ#dWdXZ$dYdZZ%d[S)\ _SIMD_ALLz* To test all vector types at once cCs|}||}||ksJ||}||ks4J||}||ksJJ||}t|d|jd}|d|jd}||ksJ||ksJdS)Nr)r-reZloadaloadsloadlr'r#)rrcZ load_dataZ loada_dataZ loads_datar Z loadl_halfZ data_halfrrrtest_memory_loads        z_SIMD_ALL.test_memory_loadcCs|}||}dg|j}|||||ks6Jdg|j}|||||ksZJdg|j}|||||ks~Jdg|j}||||d|jd|d|jdksJ||ksJdg|j}||||d|jd||jddks J||ksJdS)Nrr)r-rer#storeZstoreaZstoresZstorelZstoreh)rrcrr Zstore_aZstore_sZstore_lZstore_hrrrtest_memory_stores&            (   *z_SIMD_ALL.test_memory_storezintrin, elsizes, scale, fillzself.load_tillz, self.load_till @riz!self.load2_tillz, self.load2_tillrcCs||vrdSt|\}}|}ttd|jd}||jd|jdg7}|D]z} ||| g|R} ||| } | |9} |d| ||j| |} | | ksJ|d| dg|j| } | | ksTJqTdS)Nrrrr)r6rr-r'r$r#)rrelsizesscalefillZnpyv_load_tillzZnpyv_load_tillrclanesrZ load_tillZ load_tillz data_tillZ data_tillzrrrtest_memory_partial_loads    z"_SIMD_ALL.test_memory_partial_loadzintrin, elsizes, scale)zself.store_tillrr)zself.store2_tillrrc Cs||vrdSt|}|}|jdd}||}ttd|jd}||jd|jdg7}|D]L} |} |d| || d| |<|jdd} || | || | ksfJqfdS)NTrhrrrr6rr-rer'r$r#copy) rrrrZnpyv_store_tillrcZdata_revrrrrZ store_tillrrrtest_memory_partial_stores     z#_SIMD_ALL.test_memory_partial_store)z self.loadnrr)z self.loadn2rrc s||vrdSt|}tddD]̉dkrn| |jttjtfddt|ddD}n`dkr|d||j|}n8|j|jdttjtfddt|D}| |}|}||ks"Jq"dS) Nrrcsg|]}| dqSrrrrcstriderrr!r"z6_SIMD_ALL.test_memory_noncont_load..r?rcsg|]}|dqSrrrrrrr!r") r6rr$r-r#r' itertoolschainrsre)rrrrZ npyv_loadn data_strideZloadnrrrtest_memory_noncont_loads&   z"_SIMD_ALL.test_memory_noncont_loadz!self.loadn_tillz, self.loadn_tillz#self.loadn2_tillz, self.loadn2_tillc s||vrdSt|\}}ttd|jd}||jd|jdg7}tddD]Bdkr| |jttjtfddt|dd D}n`dkr|d||j|}n8|j|jd ttjtfd dt|D}t| |}|D]} | |} |j| } |d| || |} || g|R} | | ksbJ|d| dg| }|| }||ksJqqRdS) Nrrrrrrcsg|]}| dqSrrrrrrr!r"z>_SIMD_ALL.test_memory_noncont_partial_load..r?rcsg|]}|dqSrrrrrrr! r") r6rr'r$r#r-rr rsre)rrrrrZnpyv_loadn_tillzZnpyv_loadn_tillrr!rZnscaleZllanesZdata_stride_tillZ loadn_tillZdata_stride_tillzZ loadn_tillzrrr test_memory_noncont_partial_loads:    z*_SIMD_ALL.test_memory_noncont_partial_load)z self.storenrr)z self.storen2rrc Cs||vrdSt|}|}||}|j|}tddD]}dg||j} td|||D],} | ||} || | || | | |<qbdg||j} | dgd7} || ||| dd| ksJ| dddgdks>Jq>tddD]}dg| |j} td|||D]4} | ||} || | || | || pHd<qdgd} | dg| |j7} || ||| dd| ksJ| dddgdksJqdg|j} | } || d| d|<|| d|| | ksJdS)Nrrrqrr)r6rr-rer#r$r) rrrrZ npyv_storenrcrhlanesrZ data_storenr2rZstorenrrrtest_memory_noncont_stores>      &    z#_SIMD_ALL.test_memory_noncont_store)zself.storen_tillrr)zself.storen2_tillrrcCs||vrdSt|}|}||}ttd|jd}||jd|jdg7}|j|}tddD]} |D]} dg| |j} |d| |dg|j| |} td|| | d| D],} | | |}| |||| | | |<qdg| |j}|dgd7}||| | ||dd| ks2J|dddgdksrJqrqjtddD]} |D]} dg| |j} |d| |dg|j| |} td|| | d| D]4} | | |}| |||| | || pd<qdgd}|dg| |j7}||| | ||dd| ks.J|dddgdksbJqbqZ|D]X} dg|j} | }|d| || d| d|<||d| ||| ksVJqVdS) Nrrrrrqrr$rr)rrrrZnpyv_storen_tillrcrrr%rrrZtdatar2rZ storen_tillrrr!test_memory_noncont_partial_store?sL   $ $ & $ "z+_SIMD_ALL.test_memory_noncont_partial_storezintrin, table_size, elsize)z self.lut32rr)z self.lut16rc Csj||krdSt|}t|jd|}td|}|D],}||}||}|||} | |ks8Jq8dS)zi Test lookup table intrinsics: npyv_lut32_##sfx npyv_lut16_##sfx NrBr)r6rrrr$rA) rrZ table_sizeZelsizeZ idx_itrintablerZbroadiidxZlutrrrtest_lutns    z_SIMD_ALL.test_lutcCs|}|dg|jksJtddD]"}||}||g|jks&Jq&||jdd}}||||}}|j|}||ksJ|jdg|R} | |ksJgd} |jj r| d|jj r| d| D](} t |d | |j } | d | ksJq||||||} | |ks0J||||||}||ks\J|||dkstJ|jdS) NrrrTrhrru16Zs16rrrrf64f32Z reinterpret_rE)zeror#r$rAr-resetZsetfrrappendsimd_f32rrJselectrrZextract0cleanup)rZbroadcast_zerorZ broadcastirtrurvrwZvsetZvsetfsfxesrZvec_nameZselect_aZselect_brrr test_miscs2      z_SIMD_ALL.test_misccCs||jdd}}||||}}|d|jd}|d|jd}||jdd}||jdd}|||} | ||ksJ|||} | ||ksJ|||} | ||||fksJ|ddt||D} |ddt||D} |||}|| | fks"Jdg|jd}|d|||f|t| t| ks`J| | | }|||fks~J|d t| t| }|||fksJdS) NTrhrcSsg|]}|D]}|q qSrrrpr9rrrr!sz*_SIMD_ALL.test_reorder..cSsg|]}|D]}|q qSrrr8rrrr!srr re) r-rer#combinelcombinehcombinersrr'unzip)rrtrurvrwZ data_a_loZ data_b_loZ data_a_hiZ data_b_hir:r;r<Z data_ziplZ data_ziphZvzipr=rrr test_reorders6       z_SIMD_ALL.test_reordercsZ|dkrdSfddtd|jdD}||t|j}||ksVJdS)Nrcs,g|]$}tt||dD]}|qqS)r)r%r$)rr rssizerrr!sz0_SIMD_ALL.test_reorder_rev64..r)r6r$r#rev64re)rZ data_rev64rArr?rtest_reorder_rev64s z_SIMD_ALL.test_reorder_rev64cs|}|dkrdS||d|d|j}|dkrLddgngd}tD]Rfdd |D}|jg|R}fd d t||D}||ks\Jq\dS) z\ Test permuting elements for each 128-bit lane. npyv_permi128_##sfx rNrrr)rrrcsg|]}|?@qSrr)rZshf)rpermdrrr!r"z3_SIMD_ALL.test_reorder_permi128..cs"g|]\}}|| @qSrr)rej)rcpermnrrr!s)r6rer-r#r$Zpermi128r)rr@Znlane128ZshflindicesZvpermZ data_vpermr)rcrrErHrtest_reorder_permi128s    z_SIMD_ALL.test_reorder_permi128z func, intrinrrrrrc s|r|}n|||j}|j|dd}||||}}t||}|fdd}fddt||D}||||} | |ksJdS)NTrhcsfdd|DS)Ncsg|] }|kqSrrrrrrr! r"zH_SIMD_ALL.test_operators_comparison..to_bool..rrrrrr sz4_SIMD_ALL.test_operators_comparison..to_boolcsg|]\}}||qSrrrirrrr! r"z7_SIMD_ALL.test_operators_comparison..) r&r-r;r#r<rerrCrs) rrrrtrurvrwrrcmpr)rrrtest_operators_comparisons   z#_SIMD_ALL.test_operators_comparisoncCs|r|}n|||j}|j|dd}||||}}|rz||}||}|j|j}}n||}}dd|j}}|ddt||D} ||||} | | ksJ|ddt||D} |t |d||} | | ksJ|d dt||D} |t |d ||}|| ks.cSsg|]\}}||AqSrrrirrrr! r"z4_SIMD_ALL.test_operators_logical..cSsg|]\}}||BqSrrrirrrr!$r"rlcSsg|]\}}||@qSrrrirrrr!(r"rkcSsg|] }|qSrrrrrrr!,r"rnrcSsg|]\}}||@qSrrrirrrr!2r"rr) r&r-r;r#r<rer@rsrmrr)rrtrurvrwZ data_cast_aZ data_cast_bcastZ cast_datar|r}rzr{rxryZdata_notr~rrrrrrs8      z _SIMD_ALL.test_operators_logicalrrr rc)rrrr)r?r)rrrrr)r$ril)rr?rrNrrr?cCsB|||j}t|}t||}||}||}||ks>JdSrrrrrrr6s  z"_SIMD_ALL.test_operators_crosstestcCsd|jdd}t|jd||jf}t|jd|j|f}||d}||d|d}||kspJ||}||}||ksJdS)NrGrz cvt_%s_%sr)rrrrAr)rZbsfxZ to_booleanZ from_booleanZfalse_vbZtrue_vbZ false_vsfxZ true_vsfxrrrtest_conversion_booleanNs z!_SIMD_ALL.test_conversion_booleancCs|jdvrdS|jdtt|jddd}t|jd|d|j}|||j}||}||}|d|jd}||jdd}|||fksJdS)zh Test expand intrinsics: npyv_expand_u16_u8 npyv_expand_u32_u16 rr-NrrrZexpand_r) rstrr5rrr-r;r#re)rZtotypeexpandrcrZedataZdata_loZdata_hirrrtest_conversion_expand[s $ z _SIMD_ALL.test_conversion_expandc Cs|r|}n|||j}|j|dd}||||}}|ddt||D}|||}||ksJ|ddt||D}|||}||ksJdS)NTrhcSsg|]\}}||qSrrrirrrr!xr"z4_SIMD_ALL.test_arithmetic_subadd..cSsg|]\}}||qSrrrirrrr!{r") r&r-r;r#r<rersrr) rrtrurvrwdata_addrdata_subrrrrtest_arithmetic_subaddos    z _SIMD_ALL.test_arithmetic_subaddcCs|jdvrdS|r |}n|||j}|j|dd}||||}}|ddt||D}|||}||ksJdS)N)rrTrhcSsg|]\}}||qSrrrirrrr!r"z1_SIMD_ALL.test_arithmetic_mul..) rr&r-r;r#r<rersr)rrtrurvrwZdata_mulrrrrtest_arithmetic_muls   z_SIMD_ALL.test_arithmetic_mulcCsn|s dS||jdd}}||||}}|ddt||D}|||}||ksjJdS)NTrhcSsg|]\}}||qSrrrirrrr!r"z1_SIMD_ALL.test_arithmetic_div..)r&r-rersdiv)rrtrurvrwdata_divrYrrrtest_arithmetic_divs z_SIMD_ALL.test_arithmetic_divcsV|r dS|fddd g}|tddd7}|tddd7}|}|d krz|tdd d 7}|tdd d 7}|d kr|td dd7}|td dd7}|dkr|tddd7}|tddd7}|dd|D7}t||D]h\}|ddkr q|||}fdd|D}| }| ||}||ksJqdS)zn Test integer division intrinsics: npyv_divisor_##sfx npyv_divc_##sfx NcsR|dkr|kr|S|dk|dk}}|dks6||kr>||S||||dS)z Divide towards zero works with large integers > 2^53, and wrap around overflow similar to what C does. r?rrr)rjrZsign_aZsign_d)int_minrr trunc_divs z3_SIMD_ALL.test_arithmetic_intdiv..trunc_divrrrr ri ir(li illlcSsg|] }| qSrrrrrrr!r"z4_SIMD_ALL.test_arithmetic_intdiv..csg|]}|qSrrr)divisorr]rrr!r") r&r<r$r6rproductrArer-r`divc)rrcZbsizeZdividendZ data_divcZ divisor_parmsrbr)r`r\r]rtest_arithmetic_intdivs6    z _SIMD_ALL.test_arithmetic_intdivcCsB|jdvrdS|}||}t|}||}||ks>JdS)zH Test reduce sum intrinsics: npyv_sum_##sfx )rrr/r.N)rr-rer)rrcrdata_sumvsumrrrtest_arithmetic_reduce_sums   z$_SIMD_ALL.test_arithmetic_reduce_sumcCsj|jdvrdSd|j|||jf}|D]6}||}||}t|}||}||ks.Jq.dS)zQ Test extend reduce sum intrinsics: npyv_sumup_##sfx rQNr)rr#r<r;r-rerZsumup)rrrrcrrdrerrrtest_arithmetic_reduce_sumups    z&_SIMD_ALL.test_arithmetic_reduce_sumupc Csd||}||jdd}|||}|||}|||}|||||}||kspJ|||||}||ksJ|||}|||||}||ksJ|||||}||ksJ| sdS| ||} | ||||} | | ksJ| |||} | | ks"J| ||||} | |ks@J| |||} | |ks`JdS)z Conditional addition and subtraction for all supported data types. Test intrinsics: npyv_ifadd_##SFX, npyv_ifsub_##SFX TrhN) rer-rr0rrifsubrifaddr&rYifdivifdivz) rrvrwrbZ false_maskrVrirUrjrZrkrlrrrtest_mask_conditionals2       z_SIMD_ALL.test_mask_conditionalN)&rJr]r^rr rrrrrrr"r#r&r'r+r7r>rBrJrrrrrrrLrrrPrTrWrXr[rcrfrhrmrrrrr s      ! # + -&  &   /r )rorrrr,)r/r.)r/)r.rFrVr(rW)ztarget 'z$' isn't supported by current machinez' isn't supported by NPYVz"' doesn't support single-precisionr/z!' doesn'tsupport double-precisionr.)rrrXZTestr)reason)FFFFF)2rrrrrZnumpy._core._simdrrrZnumpy._core._multiarray_umathrrrr_rrrrr Zbool_sfxZint_sfxZfp_sfxZall_sfxZtests_registryitemsrXrrZ simd_widthrY pretty_namelenrZskipdictZskip_sfxr3rr6clsrrZskip_mZinhrrtyperJtclsrglobalsrrrrst  c{N  &