o 6a2 @sddlZddlZddlZddlZddlmZddlmZGdddZGdddeZ Gdd d eZ Gd d d eZ Gd d d eZ GdddeZ GdddeZdZdZdZeeZee ee ee de de eeiZeD]\ZZerxejndZedZeedkrddedZnedZdZeZesdedZnejsdedZn ej sded ed!<eD]?\Z!Z"e!D]8Z#e$e#eZ%e"fZ&eeee#ed"Z'e(d#e"j)d$ed$ed$e#e&e'Z*e%rej+je%d%e*e*e,e*j)<qqqodS)&N)targets)__cpu_baseline__c@seZdZdZdZdZddZd!ddZddZd d Z d d Z d dZ ddZ ddZ ddZddZddZddZddZddZdd 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)selfattrr #z'_Test_Utility._data..)nlanesrangereversed_is_fplist)r startcountreverserngr r r _datasz_Test_Utility._datacC|jddkS)Nrur r r r r _is_unsigned&z_Test_Utility._is_unsignedcCr)Nrsr!r"r r r _is_signed)r$z_Test_Utility._is_signedcCr)Nrfr!r"r r r r,r$z_Test_Utility._is_fpcCst|jddS)Nr)intr r"r r r _scalar_size/z_Test_Utility._scalar_sizecs0|r|S||fdd|DS)Ncsg|] }tt|qSr )minmax)rvmax_intmin_intr r r7z+_Test_Utility._int_clip..)r_int_max_int_min)r seqr r.r _int_clip2s z_Test_Utility._int_clipcCs4|rdS||dd}|r|dS|S)Nr)r _to_unsignedsetallr&)r max_ur r r r29s z_Test_Utility._int_maxcCs&|rdS|r dS|d S)Nrr)rr#r2r"r r r r3As z_Test_Utility._int_mincCs&t|jd|jddd}|dS)Nsetall_urr6rr)r max_unsigr r r _true_maskHsz_Test_Utility._true_maskcCspt|ttfrt|jd|jdd|S|jdd}|ddkr&d}nd}t|j||dd||S) Nload_urnpyv_rbz cvt_u{0}_b{0}zreinterpret_u{0}_{1}) isinstancertuplerrr __name__replaceformat)r vectorr cvt_intrinr r r r8Ls  z_Test_Utility._to_unsignedcC|jd}|j|dS)Nirr setall_u32reinterpret_f32_u32r r-r r r _pinfinityW z_Test_Utility._pinfinitycCrI)NlrrJrMr r r _ninfinity[rOz_Test_Utility._ninfinitycCrI)NirrJrMr r r _nan_rOz_Test_Utility._nancCs(|j}|dkr t}n|d}d|S)Nbaseline__ ) target_namersplitjoin)r targetr r r _cpu_featurescs   z_Test_Utility._cpu_featuresNNF)rD __module__ __qualname__rr rUrrr#r&rr)r5r2r3r=r8rNrPrQrYr r r r rs&   rc@s2eZdZdZd ddZddZdd Zd d ZdS) _SIMD_BOOLz2 To test all boolean vector types at once NFcsHt|jd|jdd}|t|}|rt|}fdd|DS)Nnlanes_urcsg|] }|dr ndqS)r7rr r true_maskr r rur1z$_SIMD_BOOL._data..)rrr r=rr)r rrrrrr r_r ros z_SIMD_BOOL._datacCsB|jdd}t|jd|}t|jd|d|}|||S)Nrr>cvt_b_u)r rr)r datalen_strloadcvtr r r _load_bws z_SIMD_BOOL._load_bc Cs|}|jdd}||}||}ddt||D}t|d||}||ks,Jddt||D}t|d||}||ksDJddt||D} t|d ||} | | ks\Jt|d |} | |ksiJd S) z Logical operations for boolean types. Test intrinsics: npyv_xor_##SFX, npyv_and_##SFX, npyv_or_##SFX, npyv_not_##SFX TrcSg|]\}}||@qSr r rarAr r r rz5_SIMD_BOOL.test_operators_logical..andcSg|]\}}||BqSr r rjr r r rrlorcSg|]\}}||AqSr r rjr r r rrlxornotN)rrgzipr) r data_adata_bvdata_avdata_bdata_andvanddata_orvordata_xorvxorvnotr r r test_operators_logical}s      z!_SIMD_BOOL.test_operators_logicalcCsVdd}||jddfD]}||}||}t||}|t|ks(JqdS)NcSstddt|dDS)NcSs g|] \}}t|dk|>qS)rr()rirr r r rs z<_SIMD_BOOL.test_tobits....r)sum enumerate)rcr r r rlz(_SIMD_BOOL.test_tobits..Trh)rrgbintobits)r data2bitsrcvdata data_bitsrr r r test_tobitss z_SIMD_BOOL.test_tobitsrZ)rDr[r\__doc__rrgrrr r r r r]ks   r]c@s(eZdZdZddZddZddZdS) _SIMD_INTz2 To test all integer vector types at once c s4|jdvrdS|||j}|j|dd}||||}}t|D]2|fdd|D}||}||ksEJ|fdd|D}| |}||ks]Jq+td|D]2|fdd|D}| |} | |ksJ|fd d|D}| |} | |ksJqedS) N)u8s8Trhcg|]}|>qSr r rrkrr r rrz2_SIMD_INT.test_operators_shift..cg|]}|?qSr r rrr r rrrcrr r rrr r rrcrr r rrr r rr) r rr2rr3rerr)shlshrshlishri) r rtrurvrw data_shl_ar data_shr_arrrr rr test_operators_shifts(       z_SIMD_INT.test_operators_shiftc Cs|jdvrdS|||j}|j|dd}||||}}|ddt||D}|||}||ks>J|ddt||D}| ||}||ksWJdS)N)u32s32u64s64TrhcSg|]\}}||qSr r rjr r r rrlz>_SIMD_INT.test_arithmetic_subadd_saturated..cSg|]\}}||qSr r rjr r r rrl) r rr2rr3rer5rsaddssubs) r rtrurvrw data_addsr data_subsrr r r test_arithmetic_subadd_saturateds    z*_SIMD_INT.test_arithmetic_subadd_saturatedc Cs|}||j}||||}}ddt||D}|||}||ks+Jddt||D}|||}||ksAJdS)NcSg|] \}}t||qSr r,rjr r r rz/_SIMD_INT.test_math_max_min..cSrr r+rjr r r rr)rrrersr,r+) r rtrurvrwdata_maxsimd_maxdata_minsimd_minr r r test_math_max_mins    z_SIMD_INT.test_math_max_minN)rDr[r\rrrrr r r r rs ! rc@eZdZdZddZdS) _SIMD_FP32z' To only test single precision csv|}|jjstd|rddnt||}||| d}fdd|D}| |}||ks9JdS) Round to nearest even integer, assume CPU control register is set to rounding. Test intrinsics: npyv_round_s32_##SFX z.*(NEON|ASIMD)cSst||dkr dSdS)Nr?gr)r-r r r rr1z-_SIMD_FP32.test_conversions..rcsg|]}|qSr r r_roundr r rrz/_SIMD_FP32.test_conversions..N) rYrsimd_f64rematchroundrersubr9 round_s32)r featuresrv data_roundvroundr rr test_conversionss  z_SIMD_FP32.test_conversionsNrDr[r\rrr r r r r rc@r) _SIMD_FP64z' To only test double precision cCsh||}|||d}|||d}ddt|t|D}|||}||ks2JdS)rrgcSsg|]}t|qSr )rrr r r rrz/_SIMD_FP64.test_conversions..N)rerrr9mulrr)r rvrwrrr r r rs  z_SIMD_FP64.test_conversionsNrr r r r rrrc@sPeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ dS)_SIMD_FPz0 To test all float vector types at once c Cs||gd\}}}|||}|ddt|||D}||||}||ks.J||||}|||}||ksAJ||||} |||} | | ksTJ||||} | || d} | | ksjJdS)NcSsg|] \}}}|||qSr r )rrkrAcr r r rsz2_SIMD_FP.test_arithmetic_fused..r6) reraddrsmuladdmulsubrnmuladdnmulsubrr9) r rvrwvdata_c vdata_cx2data_fmafmafmsdata_fmsnfma data_nfmanfms data_nfmsr r r test_arithmetic_fused s      z_SIMD_FP.test_arithmetic_fusedc Cs|||}}}|}||}d||f||f||ff}|D]\}}|g|j} |||} | tj | ddksDJq'|| ||d} | |ksWJdS)N)rrTnan_okr6) rNrPrQrrerabsr9pytestapproxr) r pinfninfnanrcr abs_casescasedesireddata_absvabsr r r test_abs!s  z_SIMD_FP.test_absc Cs|||}}}|}||}ddd|f||f||ff}|D]\}}|g|j} |||} | tj | ddksEJq(|dd|D} ||} | | ks[JdS)N)r)rgTrcSsg|]}t|qSr )mathsqrtrr r r r:z&_SIMD_FP.test_sqrt..) rNrPrQrrerrr9rr) r rrrrcr sqrt_casesrr data_sqrtrr r r test_sqrt/s   z_SIMD_FP.test_sqrtc Cs|||}}}|}||}||f||f||ff}|D]\}}|g|j} |||} | tj | ddksCJq&dd|D} ||} | | ksVJdS)NTrcSsg|]}||qSr r rr r r rIrz(_SIMD_FP.test_square..) rNrPrQrrersquarer9rr) r rrrrcr square_casesrr data_squarerr r r test_square>s   z_SIMD_FP.test_squarec CsX|}||j}||||}}ddt||D}|||}||ks+J|||}||ks7J|||}} } | | | f| ddfd| df|||f|d|fd||f| | | f| ddfd| dfddf } | D]:\} } }|g|j}| | }| | }|||}|t j |ddksJ| | | |fvrqo|||}||ksJqodS) zY Test intrinsics: npyv_max_##SFX npyv_maxp_##SFX cSrr rrjr r r rVrz%_SIMD_FP.test_max.. )rrr)rrTrN) rrrersr,maxprNrPrQr9rr)r rtrurvrwr_maxrrrr max_cases case_operand1 case_operand2rr r r test_maxM2          z_SIMD_FP.test_maxc CsX|}||j}||||}}ddt||D}|||}||ks+J|||}||ks7J|||}} } | | | f| ddfd| df|||f|ddfd|df| | | f| d| fd| | fddf } | D]:\} } }|g|j}| | }| | }|||}|t j |ddksJ| | | |fvrqo|||}||ksJqodS) zY Test intrinsics: npyv_min_##SFX npyv_minp_##SFX cSrr rrjr r r rurz%_SIMD_FP.test_min..r)rrr)rrrTrN) rrrersr+minprNrPrQr9rr)r rtrurvrwr_minrrrr min_casesrrrr r r test_minlrz_SIMD_FP.test_minc Cs|||}}}|}||}||f|df|dfd|fd|ff}|D]\}}|g|j} |||} | tj | ddksIJq,|dd|D} ||} | | ks_JdS)NrrTrcSsg|]}d|qS)rr rr r r rrz,_SIMD_FP.test_reciprocal..) rNrPrQrrerrecipr9rr) r rrrrcr recip_casesrr data_reciprr r r test_reciprocals"   z_SIMD_FP.test_reciprocalcCs,|||}|dg|jksJdS)zQ Compare Not NaN. Test intrinsics: npyv_notnan_##SFX rN)notnanr9rQr)r nnanr r r test_special_casessz_SIMD_FP.test_special_casesN) rDr[r\rrrrrrrrrr r r r r s rc@seZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.S)/ _SIMD_ALLz* To test all vector types at once cCs|}||}||ksJ||}||ksJ||}||ks%J||}t|d|jd}|d|jd}||ksDJ||ksJJdS)Nr7)rreloadaloadsloadlrr)r rc load_data loada_data loads_datar loadl_half data_halfr r r test_memory_loads        z_SIMD_ALL.test_memory_loadcCs|}||}dg|j}|||||ksJdg|j}|||||ks-Jdg|j}|||||ks?Jdg|j}||||d|jd|d|jdks_J||kseJdg|j}||||d|jd||jddksJ||ksJdS)Nrr7)rrerstorestoreastoresstorelstoreh)r rcrr store_astore_sstore_lstore_hr r r test_memory_stores&            (   (z_SIMD_ALL.test_memory_storecCs|jdvrdS|}ttd|jd}||jd|jdg7}|D]7}|||d}|d|dg|j|}||ks@J|||}|d|dg|j|}||ksZJq#dS)Nrru16s16rr7r)r rrrr load_till load_tillz)r rclanesnr data_tillr data_tillzr r r test_memory_partial_loads   z"_SIMD_ALL.test_memory_partial_loadcCs|jdvrdS|}|jdd}||}ttd|jd}||jd|jdg7}|D]#}|}|d||d|<|jdd}||||||ksQJq.dS)NrTrhrr7r)r rrerrrcopy store_till)r rcdata_revrrrr r$r r r test_memory_partial_stores    z#_SIMD_ALL.test_memory_partial_storecCs|jdvrdStddD]}|j||jd}|dd|}|||}||ks*Jq tddD]"}||| |j}||dd|}|||}||ksRJq0dS)Nrr@rr)r rrrloadnre)r striderc data_strider)r r r test_memory_noncont_loads   z"_SIMD_ALL.test_memory_noncont_loadc Cs|jdvrdSttd|jd}||jd|jdg7}tddD]N}|j||jd}|dd|}|D]9}|d|dg|j|}||||d}||ksTJ|d|dg|j|}||||} | |ksoJq6q"td dD]T}||| |j}t||dd|}|D]9}|d|dg|j|}||||d}||ksJ|d|dg|j|}||||} | |ksJqqvdS) Nrrr7rr'rrrr()r rrrr loadn_till loadn_tillzre) r rr*rcr+rdata_stride_tillr-data_stride_tillzr.r r r test_memory_noncont_partial_loads6   z*_SIMD_ALL.test_memory_noncont_partial_loadcCs4|jdvrdS||}tddD]>}dg||j}||dd|<dg||j}|dgd7}|||||dd|ksDJ|dddgdksQJqtddD]@}dg| |j}||dd|<dgd}|dg| |j7}|||||dd|ksJ|dddgdksJqWdS)Nrrr'rr(r)r rerrrstoren)r rr*rcr3r r r test_memory_noncont_stores(  z#_SIMD_ALL.test_memory_noncont_storecCs|jdvrdS|}||}ttd|jd}||jd|jdg7}tddD]P}|D]K}dg||j}|d|dg|j||dd|<dg||j}|dgd7}||||||dd|ksmJ|dddgdkszJq/q+tdd D]R}|D]M}dg| |j}|d|dg|j||dd|<dgd}|dg| |j7}||||||dd|ksJ|dddgdksJqqdS) Nrrr7rr'rr2r(r)r rrerrr storen_till)r rcrrr*rr r5r r r !test_memory_noncont_partial_store4s6  & & z+_SIMD_ALL.test_memory_noncont_partial_storecCsT|}|dg|jksJtddD]}||}||g|jks$Jq||jdd}}||||}}|j|}||ksFJ|jdg|R} | |ksUJgd} |jj rb| d| D]} t |d| |j } | d | ksxJqd| |||||} | |ksJ| |||||}||ksJ|jdS) NrrrTrh) rrrrrrrrf32f64 reinterpret_r?)zerorrr9rresetsetfrrappendrrDselectcmpeqcmpneqcleanup)r broadcast_zeror broadcastirtrurvrwvsetvsetfsfxesr vec_nameselect_aselect_br r r test_miscPs,       z_SIMD_ALL.test_misccCs||jdd}}||||}}|d|jd}|d|jd}||jdd}||jdd}|||} | ||ksHJ|||} | ||ksVJ|||} | ||||fkshJddt||D} ddt||D} |||}|| | fksJdS)NTrhr7cSg|] }|D]}|qqSr r rpr-r r r rrz*_SIMD_ALL.test_reorder..cSrKr r rLr r r rr)rrercombinelcombinehcombiners)r rtrurvrw data_a_lo data_b_lo data_a_hi data_b_hirNrOrP data_zipl data_ziphvzipr r r test_reorderxs     z_SIMD_ALL.test_reordercsZ|dkr dSfddtd|jdD}||t|j}||ks+JdS)Nr'cs,g|]}tt||dD]}|qqS)r')rr)rryssizer r rsz0_SIMD_ALL.test_reorder_rev64..r)r)rrrev64re)r data_rev64r\r rZr test_reorder_rev64s z_SIMD_ALL.test_reorder_rev64cs|r |}n |||j}|j|dd}||||}}|fdd}ddt||D}||||}||ksIJddt||D}|| ||} | |ksaJddt||D} || ||} | | ksyJd dt||D} || ||} | | ksJd dt||D}|| ||}||ksJd dt||D}|| ||}||ksJdS) NTrhcsfdd|DS)Ncsg|]}|kqSr r )rlane mask_truer r rrzH_SIMD_ALL.test_operators_comparison..to_bool..r )rGr`r r to_boolr*z4_SIMD_ALL.test_operators_comparison..to_boolcSsg|]\}}||kqSr r rjr r r rrlz7_SIMD_ALL.test_operators_comparison..cSsg|]\}}||kqSr r rjr r r rrlcSsg|]\}}||kqSr r rjr r r rrlcSsg|]\}}||kqSr r rjr r r rrlcSsg|]\}}||kqSr r rjr r r rrlcSsg|]\}}||kqSr r rjr r r rrl)rrr2rr3rer=rsr?r@cmpgtcmpgecmpltcmple)r rtrurvrwrbdata_eqr?data_neqr@data_gtrcdata_gerddata_ltredata_lerfr r`r test_operators_comparisons2       z#_SIMD_ALL.test_operators_comparisoncCsl|r |}n |||j}|j|dd}||||}}|r=||}||}|j|j}}n ||}}dd|j}}|ddt||D} ||||} | | ksdJ|ddt||D} |t |d||} | | ksJ|d dt||D} |t |d ||}|| ksJ|d d|D}|t |d |}||ksJdS) NTrhcSs|S)Nr )rkr r r rsz2_SIMD_ALL.test_operators_logical..cSrpr r rjr r r rrlz4_SIMD_ALL.test_operators_logical..cSrnr r rjr r r rrlrocSrir r rjr r r rrlrmcSsg|]}|qSr r rr r r rrr) rrr2rr3rer8rsrqr)r rtrurvrw data_cast_a data_cast_bcast cast_datar|r}rzr{rxrydata_notr~r r r rs.       z _SIMD_ALL.test_operators_logicalcCsd|jdd}t|jd||jf}t|jd|j|f}||d}||d|d}||ks8J||}||}||ksFJdS)NrArz cvt_%s_%sr)r rrr9r?)r bsfx to_boolean from_booleanfalse_vbtrue_vb false_vsfx true_vsfxr r r test_conversion_booleans z!_SIMD_ALL.test_conversion_booleancCs|jdvrdS|jdtt|jddd}t|jd|d|j}|||j}||}||}|d|jd}||jdd}|||fksSJdS)zh Test expand intrinsics: npyv_expand_u16_u8 npyv_expand_u32_u16 rrNrrr7expand_r) r strr(rrrr2rre)r totypeexpandrcredatadata_lodata_hir r r test_conversion_expands $ z _SIMD_ALL.test_conversion_expandc Cs|r |}n |||j}|j|dd}||||}}|ddt||D}|||}||ks@J|ddt||D}|||}||ksYJdS)NTrhcSrr r rjr r r r rlz4_SIMD_ALL.test_arithmetic_subadd..cSrr r rjr r r r rl) rrr2rr3rersrr) r rtrurvrwdata_addrdata_subrr r r test_arithmetic_subadds    z _SIMD_ALL.test_arithmetic_subaddcCs|jdvrdS|r|}n |||j}|j|dd}||||}}|ddt||D}|||}||ksGJdS)N)rrTrhcSsg|]\}}||qSr r rjr r r rrlz1_SIMD_ALL.test_arithmetic_mul..) r rrr2rr3rersr)r rtrurvrwdata_mulrr r r test_arithmetic_muls   z_SIMD_ALL.test_arithmetic_mulcCsn|sdS||jdd}}||||}}|ddt||D}|||}||ks5JdS)NTrhcSsg|]\}}||qSr r rjr r r r(rlz1_SIMD_ALL.test_arithmetic_div..)rrrersdiv)r rtrurvrwdata_divrr r r test_arithmetic_div s z_SIMD_ALL.test_arithmetic_divcsT|rdS|fddd g}|tddd7}|tddd7}|}|d kr=|tdd d 7}|tdd d 7}|d krQ|td dd7}|td dd7}|dkre|tddd7}|tddd7}|dd|D7}t||D]3\}|ddkrqt|||}fdd|D}| }| ||}||ksJqtdS)zn Test integer division intrinsics: npyv_divisor_##sfx npyv_divc_##sfx NcsR|dkr |kr |S|dk|dk}}|dks||kr||S||||dS)z Divide towards zero works with large integers > 2^53, and wrap around overflow similar to what C does. r6rrr )rkdsign_asign_d)int_minr r trunc_div6s z3_SIMD_ALL.test_arithmetic_intdiv..trunc_divrr ii ili illlcSsg|]}| qSr r rr r r rPrnz4_SIMD_ALL.test_arithmetic_intdiv..csg|]}|qSr r r)divisorrr r rVr) rr3rr) itertoolsproductr9rerrdivc)r rcbsizedividend data_divc divisor_parmsrr )rrrr test_arithmetic_intdiv,s8    z _SIMD_ALL.test_arithmetic_intdivcCsB|jdvrdS|}||}t|}||}||ksJdS)zH Test reduce sum intrinsics: npyv_sum_##sfx )rrr7r8N)r rrer)r rcrdata_sumvsumr r r test_arithmetic_reduce_sum[s   z$_SIMD_ALL.test_arithmetic_reduce_sumcCsj|jdvrdSd|j|||jf}|D]}||}||}t|}||}||ks2JqdS)zQ Test extend reduce sum intrinsics: npyv_sumup_##sfx r|Nr)r rr3r2rrersumup)r rdatarrcrrrr r r test_arithmetic_reduce_sumupjs    z&_SIMD_ALL.test_arithmetic_reduce_sumupc Cs||}||jdd}|||}|||}|||}|||||}||ks8J|||||}||ksFJ|||}|||||}||ksZJ|||||}||kshJdS)z Conditional addition and subtraction for all supported data types. Test intrinsics: npyv_ifadd_##SFX, npyv_ifsub_##SFX TrhN) rerr?r:r@rifsubrifadd) r rvrwr` false_maskrrrrr r r test_mask_conditionalys     z_SIMD_ALL.test_mask_conditionalN)rDr[r\rr rr"r&r,r1r4r6rJrXr^rmrr{rrrrrrrrr r r r rs0( $   / r)b8b16b32b64)rrrrrrrr)r7r8)r7)r8r@rSr(rT)ztarget 'z$' isn't supported by current machinez' isn't supported by NPYVz"' doesn't support double-precisionr8)rr rUTestr)reason)-rrrrnumpy.core._simdrnumpy.core._multiarray_umathrrr]rrrrrbool_sfxint_sfxfp_sfxall_sfxtests_registryitemsrUrsimd simd_widthrV pretty_namelenrWskipdictskip_sfxrrFclsr getskip_minhrr typerDtclsmarkglobalsr r r r sh  c4Bq   &