o 6al @sFddlZddlZddlZddlmZmZddlmZedko!eduZ e rWddl Z ddl Z ddl Z ddl Z ejeeeedddlmZe jddZdd d ZnddlmZdd lmZmZed d ddddddZGdddeZGdddZddZ eD]\Z Z!e!D] Z"e#ee e"qqe re $dSdS)N)syspath)DistutilsError__main__z..) CCompilerOptc os6tj|i|}z |VWt|dSt|wN)tempfilemkdtempshutilrmtree)argskwargstmpdirrJ/usr/lib/python3/dist-packages/numpy/distutils/tests/test_ccompiler_opt.pytempdir s rcCs|st|dSr)AssertionError)exprmsgrrrassert_sr)rr)gccclangicciccwmsvc)rr)r)x86x64ppc64ppc64learmhfaarch64noarchc@sDeZdZdZdddZddZddZdd Zed d d d Z dS)FakeCCompilerOptrcOs$||_||_tj|dfi|dSr)fake_trap_filesfake_trap_flagsr__init__)self trap_files trap_flagsr r rrrr&(szFakeCCompilerOpt.__init__cCstd|j|j|S)Nz <<<< march : {} compiler : {} ---------------- {} >>>> )textwrapdedentformatcc_marchcc_namereportr'rrr__repr__-szFakeCCompilerOpt.__repr__cKst|tsJt|tsJ|jr"|D]}t|j|r!|dq|jr6|D]}t|j|r5|dq't|d|gt |S)Nz%source is trapped by a fake interfacez#flag is trapped by a fake interface ) isinstancelistr$rematch dist_errorr%zipjoinlen)r'sourcesflagsr srcfrrr dist_compile7s  zFakeCCompilerOpt.dist_compilecCstjSr)r# fake_infor0rrr dist_infoEszFakeCCompilerOpt.dist_infoF)stderrcGsdSrr)rBr rrrdist_logHszFakeCCompilerOpt.dist_logN)rr) __name__ __module__ __qualname__r@r&r1r?rA staticmethodrCrrrrr#&s  r#c@seZdZdZdZddZddZddZdd Zd d Z d d Z ddZ d5ddZ d5ddZ d5ddZifddZifddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4ZdS)6_Test_CCompilerOptNcCsdt_d|_dS)NT)r# conf_nocache_optr0rrrsetupPs z_Test_CCompilerOpt.setupcOs|j|jdft_t|i|SNr)archccr#r@)r'r r rrrnoptTsz_Test_CCompilerOpt.noptcCs|js||_|jSr)rJrOr0rrroptXs z_Test_CCompilerOpt.optcC |jSr)rPr-r0rrrmarch] z_Test_CCompilerOpt.marchcCrQr)rPr.r0rrrr.`rSz_Test_CCompilerOpt.cc_namec s|t_|j|dd|dd|dd|ddd}tp}tj|d }t|d  }| |Wdn1ssz2_Test_CCompilerOpt.get_targets..c3s|]}|vVqdSrr)rbtgtargetsrr sz1_Test_CCompilerOpt.get_targets..zM'sources_status' returns different targets than the compiled targets %s != %s)r#conf_target_groupsrOgetrosrr9openwrite try_dispatchbasenamesplitr:upperappendsources_statusallr)r'targetsgroupsr rPrfiler>gflags fake_objectssourcer<gtarglen has_baselinerrfr get_targetscsN          &z_Test_CCompilerOpt.get_targetsc Kstddddd}|}|}|||}|||}|||||d||d||d||d|fD]}||d}|durDnq6|rxt|tre|D]\} } | dddvrb| d || <qP|St|tslJ|dddvrx|d 7}|S) Nrrr r)rrr!r_r^z)}$?\.+*$)dictrRr.rjpopr3itemsstr) r'r map2originrRr. map_marchmap_cckeyregexkvrrr arg_regexs<         z_Test_CCompilerOpt.arg_regexrcKs|jd i|}|durdS|j|||dd|ddd}d|}|s6t|dkr4td|dSt||tj sFtd||fdS) Nr(rr)rXr2r!expected empty features, not "%s"z%dispatch features "%s" not match "%s"r) rrOrjr9cpu_dispatch_namesr:rr5r6 IGNORECASE)r'rVrTr r6rPfeaturesrrrexpect(    z_Test_CCompilerOpt.expectcKs|jd i|}|durdS|j|||dd|ddd}d|}|s6t|dkr4td|dSt||tj sFtd||fdS) Nr(rr)rXr2rrz%baseline features "%s" not match "%s"r) rrOrjr9cpu_baseline_namesr:rr5r6r)r'rTrVr r6rPrrrrexpect_baselinerz"_Test_CCompilerOpt.expect_baselinecKs|jd i|}|durdS|j|||dd|ddd}d|}|s6t|dkr4td|dSt||sDtd||fdS) Nr(rr)rXr2rzexpected empty flags not "%s"zflags "%s" not match "%s"r) rrOrjr9cpu_baseline_flagsr:rr5r6)r'rTrVr r6rPr<rrr expect_flagss(     z_Test_CCompilerOpt.expect_flagscKs|jdi|}|durdS|jd||d|\}}d|}|s0t|dkr.td|dSt||tjs@td||fdS)Nrurvr2rz expected empty targets, not "%s"ztargets "%s" not match "%s"r)rr~r9r:rr5r6r)r'rurvr r6rrrrexpect_targetss    z!_Test_CCompilerOpt.expect_targetsc Ks|jdi|}|durdSt|tsJ|j||d\}}|D]/\}}||vr0td|||} |sBt| dkrBtd|t|| sQtd|| |fq"dS)Nrzexpected to find target "%s"rz+expected to find empty flags in target "%s"z"%s" flags "%s" not match "%s"r) rr3rr~rrr:r5r6) r'rurvr match_dictr tar_flags match_tar match_flagsr<rrrexpect_target_flagss,   z&_Test_CCompilerOpt.expect_target_flagscCs|jdkrdnd}|jdkrdnd}|}tt|d|jtt|d| tt|d|jtt|d| dS)Nrrrrcc_on_cc_is_)rMrNrPrgetattr)r' wrong_archwrong_ccrPrrrtest_interfacesz!_Test_CCompilerOpt.test_interfacecCsHdD]\}}|j||d}t|dksJt|dks!JqdS)N))rnonerL)z none +nonez none - none)z none -maxz min - max)z +vsx2 -VSX2zvsx avx2 avx512f -max)z#max -vsx - avx + avx512f neon -MAX z+min -min + max -max -vsx + avx2 -avx2 +NONErYrZr)rOr:rr)r'rTrVrPrrrtest_args_emptys  z"_Test_CCompilerOpt.test_args_emptyc CsJ|dkrdSdD]\}}z |j||dtdty"Yq wdS)Nunknown))zunkown_feature - max +minzunknown max min)z#avx2z$vsxrz+excepted an exception for invalid arguments)rRrOrr)r'rTrVrrrtest_args_validation,s   z'_Test_CCompilerOpt.test_args_validationcCsT|jdddddd|jddd d dd|jd d dddd |jd d dddd dS)Nz sse vsx neonssevsxneonrrrr rz)sse41 avx avx2 vsx2 vsx3 neon_vfpv4 asimdzsse41 avx avx2 vsx2 vsx3zneon_vfpv4 asimdz sse neon vsx)rTrrr zavx2 vsx3 asimdhp)rr0rrr test_skip:s& z_Test_CCompilerOpt.test_skipcCs|jddddd dD] \}}d||f}|j|d|||d |j|d |||d q d D]}|D]}|j|d d |dq3q/|jddddD] }|j|ddqLdS)Nzfma3 avx2 asimd vsx3zsse .* sse41 .* fma3.*avx2z vsx vsx2 vsx3zneon neon_fp16 neon_vfpv4 asimdrrr )fma3avx2)avx512favx512cdz.* sse42 .* %s .*%s$z.* sse42 .* %s$)x86_gccx86_iccx86_iccwz .* avx .* %s$)r)rr avx512_skxz.*%sr2)x86_msvcrvsx vsx2)r)r neon_fp16 neon_vfpv4asimd)r!)rr9)r'f0f1diffr>ffrrr test_impliesRs6   z_Test_CCompilerOpt.test_impliesc CsdD]9}|dkr|dkrq|j|ddddd|j|ddd d ddd |j|d d ddd|j|dddddddq|jdddddddd|jdddddz|jdddddd|dkrjtd |WdSty|dkr}td!YdSw)"N)rWnativerrz.*cpu_(sse|vsx|neon).cr)r(rrr z.*cpu_(sse3|vsx2|neon_vfpv4).czsse sse2rzneon neon_fp16)r(rrr r!rz.*cpu_(popcnt|vsx3).cz sse .* sse41rzneon neon_fp16 .* asimd .*z=.* xop fma4 .* avx512f .* avx512_knl avx512_knm avx512_skx .*z1.* avx512f .* avx512_knl avx512_knm avx512_skx .*z'.* xop fma4 .* avx512f .* avx512_skx .*z.* asimd asimdhp asimddp .*zvsx vsx2 vsx3.*)rrrrr rrUz sse sse2 sse3zneon neon_fp16 .* asimd)rrr r!rrz.*cpu_(sse2|vsx2).c)r(rrz".*(-march=native|-xHost|/QxHost).*.*)r)rrr rexcepted an exception for %sexcepted no exceptions)r.rrRrr)r'orrrtest_args_options{sb     z$_Test_CCompilerOpt.test_args_optionsc Csj|jdddddddddd |jd dd d |jd d dd|jddd|jddd|jddddS)Nz sse sse2 vsx vsx2 neon neon_fp16z -msse -msse2z /arch:SSE2z -mcpu=power8z-maltivec -mvsx -mpower8-vectorz"-mfpu=neon-fp16 -mfp16-format=ieeer)rrrr ppc64_gcc ppc64_clang armhf_gccr!rz;-mfp16-format=ieee -mfpu=neon-fp-armv8 -march=armv8-a\+simd)r!rasimdhpz-march=armv8.2-a\+fp16z=-mfp16-format=ieee -mfpu=neon-fp-armv8 -march=armv8.2-a\+fp16) aarch64_gccrasimddpz-march=armv8.2-a\+dotprod)rasimdfhmz-march=armv8.2-a\+fp16\+fp16fmlzasimddp asimdhp asimdfhmz(-march=armv8.2-a\+dotprod\+fp16\+fp16fml)rr0rrr test_flagss:  z_Test_CCompilerOpt.test_flagsc CsfdD].}z|j|dddd|dkrtd|Wqty0|dkr.tdYqwdS)N)zbla blaz /*@targetsz /*@targets */z/*@targets unknown */z"/*@targets $unknown_policy avx2 */z!/*@targets #unknown_group avx2 */z/*@targets $ */z/*@targets # vsx */z/*@targets #$ vsx */z/*@targets vsx avx2 ) */z/*@targets vsx avx2 (avx2 */z/*@targets vsx avx2 () */z!/*@targets vsx avx2 ($autovec) */z/*@targets vsx avx2 (xxx) */z!/*@targets vsx avx2 (baseline) */r)rr rrrr)rrRrrr'rurrrtest_targets_exceptionss"    z*_Test_CCompilerOpt.test_targets_exceptionscCs"dD] }|j|dddddqdS)N)z(/*@targets $keep_baseline sse vsx neon*/z(/*@targets,$keep_baseline,sse,vsx,neon*/z(/*@targets*$keep_baseline*sse*vsx*neon*/zo /* ** @targets ** $keep_baseline, sse vsx,neon */ z /* ************@targets************* ** $keep_baseline, sse vsx, neon ********************************* */ z /* /////////////@targets///////////////// //$keep_baseline//sse//vsx//neon ///////////////////////////////////// */ zg /* @targets $keep_baseline SSE VSX NEON*/ rrrrrrrrrrtest_targets_syntaxs z&_Test_CCompilerOpt.test_targets_syntaxc Csb|jdddddd|jddd d d d d |jddddd dd|jddddddddddd dS)Nz /*@targets sse sse2 sse41 avx avx2 avx512f vsx vsx2 vsx3 neon neon_fp16 asimdhp asimddp */ zavx vsx2 asimdz avx512f avx2zasimddp asimdhpvsx3)rTrr rz /*@targets sse41 avx avx2 avx512f vsx2 vsx3 asimd asimdhp asimddp */ rzsse41 avx2 vsx2 asimd asimddpz avx2 sse41 asimddp asimdvsx2)rTrVrr rz /*@targets sse2 sse41 avx2 avx512f vsx2 vsx3 neon asimdhp asimddp */ z.*(avx2|avx512f|vsx3|asimddp).cz sse41 sse2z asimdhp neon)rTr(rrr z /*@targets sse sse2 avx fma3 avx2 avx512f avx512cd vsx vsx2 vsx3 neon neon_vfpv4 neon_fp16 neon_fp16 asimd asimdhp asimddp asimdfhm */ z#avx512cd avx512f avx2 fma3 avx sse2zavx512cd avx2 avx sse2z vsx3 vsx2 vsx vsx3 vsx2z8asimdfhm asimddp asimdhp asimd neon_vfpv4 neon_fp16 neonzasimdfhm asimddp asimdhp asimd) rTrrrrrrr r!rr0rrr test_targetss8    z_Test_CCompilerOpt.test_targetsc Cs|jddddddd|jdd d d d d |jddddddddddD]}|jd|ddiddiddiddiddidq$|jdddiddiddiddiddiddS)Nz /*@targets $keep_baseline sse2 sse42 avx2 avx512f vsx2 vsx3 neon neon_vfpv4 asimd asimddp */ zsse41 avx2 vsx2 asimd vsx3zavx512f avx2 sse42 sse2rzasimddp asimd neon_vfpv4 neonr)rTrrr r!z /*@targets $keep_baseline $keep_sort avx512f sse42 avx2 sse2 vsx2 vsx3 asimd neon neon_vfpv4 asimddp */ zavx512f sse42 avx2 sse2rzasimd neon neon_vfpv4 asimddpz asimd asimddp)rrr r!z /*@targets $keep_baseline $keep_sort $autovec avx512f avx2 sse42 sse41 sse2 vsx3 vsx2 asimddp asimd neon_vfpv4 neon */ zavx512f avx2 sse42 sse41 sse2zavx512f avx2 sse2)rrrrrr r!)z$maxoptz$autovecz/*@targets baseline %s */rTz.*-O3.*z.*/O3.*z.*/O2.*r)rrrrrz/*@targets baseline $werror */z .*-Werror.*z .*/Werror.*z.*/WX.*)rr)r'policyrrrtest_targets_policiesOsL     z(_Test_CCompilerOpt.test_targets_policiesc Cs>|jdtdddddd|jdtd d d d d dddddS)NzK /*@targets $keep_baseline baseline #test_group */ z $keep_baseline asimddp sse2 vsx2 avx2 vsx3 avx512f asimdhp ) test_groupzavx512f avx2 sse2 baselinezvsx3 vsx2 baselinezasimddp asimdhp baseline)rvrrr z /*@targets * sse42 avx avx512f * #test_group_1 * vsx2 * #test_group_2 * asimddp asimdfhm */ z@ VSX2 vsx3 asimd avx2 SSE41 z@ vsx2 vsx3 asImd aVx2 sse41 ) test_group_1 test_group_2zavx512f avx2 avx sse42 sse41rrzasimdfhm asimddp asimdzasimdfhm asimddp)rvrrrr r!)rrr0rrrtest_targets_groupss*  z&_Test_CCompilerOpt.test_targets_groupscCsN|jdddd|jdddddd |jd d ddd |jd ddddddS)Nzm /*@targets (avx512_clx avx512_cnl) (asimdhp asimddp) */ z\(avx512_clx avx512_cnl\)z\(asimdhp asimddp\))rr z /*@targets f16c (sse41 avx sse42) (sse3 avx2 avx512f) vsx2 (vsx vsx3 vsx2) (neon neon_vfpv4 asimd asimdhp asimddp) */ zavx512f f16c avxrr)rrrr z /*@targets $keep_sort (sse41 avx sse42) (sse3 avx2 avx512f) (vsx vsx3 vsx2) (asimddp neon neon_vfpv4 asimd asimdhp) */ z avx avx512frzz /*@targets $keep_sort fma3 avx2 (fma3 avx2) (avx2 fma3) avx2 fma3 */ zfma3 avx2 \(fma3 avx2\)r)rrrrrr0rrrtest_targets_multis0   z%_Test_CCompilerOpt.test_targets_multir)rDrErFrMrNrKrOrPrRr.r~rrrrrrrrrrrrrrrrrrrrrrrrHLs8,      )6!$;G ,rHcCs@trtdj|d|||dStdj|d|||dS)Na class TestCCompilerOpt_{class_name}(_Test_CCompilerOpt, unittest.TestCase): arch = '{arch}' cc = '{cc}' def __init__(self, methodName="runTest"): unittest.TestCase.__init__(self, methodName) self.setup() r) class_namerMrNzo class TestCCompilerOpt_{class_name}(_Test_CCompilerOpt): arch = '{arch}' cc = '{cc}' ) is_standaloner*r+r,)rMrNrrrnew_tests  rr)%r5r*rkrrdistutils.errorsrrD __package__runittest contextlibrr rrabspathr9dirname__file__ ccompiler_optrcontextmanagerrrnumpy.distutils.ccompiler_opt numpy.testingrarch_compilersr#rHrrrM compilersrNexecmainrrrrsL        &,