o
    Dfjp                  
   @   sH  d dl Z d dlZd dlZd dlmZmZ d dlmZ edko!edu Z	e	rWd dl
Z
d dlZd dlZd dlZejeeeed d dlmZ ejdd Zdd
dZnd dlmZ d dlmZmZ edddddddddZG dd deZG dd dZdd Z	 e D ]\Z Z!e!D ]	Z"e#ee e" qqe	re
$  dS dS )    N)syspath)DistutilsError__main__z..)CCompilerOptc               	   o   s6    t j| i |}z|V  W t| d S t| w N)tempfilemkdtempshutilrmtree)argskwargstmpdir r   a/home/ubuntu/webapp/venv/lib/python3.10/site-packages/numpy/distutils/tests/test_ccompiler_opt.pytempdir   s
   r    c                 C   s   | st |d S r   )AssertionError)exprmsgr   r   r   assert_   s   r   )r   r   )gccclangicciccwmsvc)r   r   )r   r   fcc)r   )x86x64ppc64ppc64learmhfaarch64s390xnoarchc                   @   sD   e Zd ZdZdddZdd Zdd Zdd	 Zed
dddZ	dS )FakeCCompilerOptr   c                 O   s$   || _ || _tj| d fi | d S r   )fake_trap_filesfake_trap_flagsr   __init__)self
trap_files
trap_flagsr   r   r   r   r   r(   )   s   zFakeCCompilerOpt.__init__c                 C   s   t d| j| j|  S )Nz            <<<<
            march    : {}
            compiler : {}
            ----------------
            {}
            >>>>
        )textwrapdedentformatcc_marchcc_namereportr)   r   r   r   __repr__.   s   zFakeCCompilerOpt.__repr__c                 K   s   t |tsJ t |tsJ | jr"|D ]}t| j|r!| d q| jr6|D ]}t| j|r5| d q't|d|gt	| S )Nz%source is trapped by a fake interfacez#flag is trapped by a fake interface )

isinstancelistr&   rematch
dist_errorr'   zipjoinlen)r)   sourcesflagsr   srcfr   r   r   dist_compile8   s   

zFakeCCompilerOpt.dist_compilec                 C   s   t jS r   )r%   	fake_infor2   r   r   r   	dist_infoF   s   zFakeCCompilerOpt.dist_infoF)stderrc                 G   s   d S r   r   )rD   r   r   r   r   dist_logI   s   zFakeCCompilerOpt.dist_logN)r   r   )
__name__
__module____qualname__rB   r(   r3   rA   rC   staticmethodrE   r   r   r   r   r%   '   s    

r%   c                   @   s   e Zd ZdZdZdd Zdd Zdd Zdd	 Zd
d Z	dd Z
dd Zd5ddZd5ddZd5ddZi fddZi fddZdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 ZdS )6_Test_CCompilerOptNc                 C   s   dt _d | _d S )NT)r%   conf_nocache_optr2   r   r   r   setup_classQ   s   
z_Test_CCompilerOpt.setup_classc                 O   s   | j | jdft_t|i |S Nr   )archccr%   rB   )r)   r   r   r   r   r   noptU   s   z_Test_CCompilerOpt.noptc                 C   s   | j s|  | _ | j S r   )rL   rQ   r2   r   r   r   optY   s   
z_Test_CCompilerOpt.optc                 C   
   |   jS r   )rR   r/   r2   r   r   r   march^      
z_Test_CCompilerOpt.marchc                 C   rS   r   )rR   r0   r2   r   r   r   r0   a   rU   z_Test_CCompilerOpt.cc_namec              	      s  |t _| j|dd|dd|dd|ddd}t p}tj|d	}t|d
}|	| W d    n1 s<w   Y  g  i }|
|g}	|	D ]:\}
}t|
ddd }t|}|dkrhd}n|dkrs|d  }ndd| d  } | |||< qMW d    n1 sw   Y  |j| \}}|r|dg n|}dd |D }t|t kst fdd|D std| f ||fS )Nbaselinemindispatchmaxr*   r   r+   cpu_baselinecpu_dispatchr*   r+   ztest_targets.cw.   r   (r4   )c                 S   s,   g | ]}t |trd d| d n|qS )ra   r4   rb   )r5   tupler;   ).0tarr   r   r   
<listcomp>   s    z2_Test_CCompilerOpt.get_targets.<locals>.<listcomp>c                 3   s    | ]}| v V  qd S r   r   )rd   tgtargetsr   r   	<genexpr>   s    z1_Test_CCompilerOpt.get_targets.<locals>.<genexpr>zM'sources_status' returns different targets than the compiled targets
%s != %s)r%   conf_target_groupsrQ   getr   osr   r;   openwritetry_dispatchbasenamesplitr<   upperappendsources_statusallr   )r)   targetsgroupsr   rR   r   filer@   gflagsfake_objectssourcer>   gtarglenhas_baseliner   rh   r   get_targetsd   sN   





&z_Test_CCompilerOpt.get_targetsc              	   K   s   t ddddd}|  }|  }|||}|||}|||||d | |d | |d | |d | fD ]}||d }|d urD nq6|rxt|t re| D ]\}	}
|
dd  dvrb|
d	 ||	< qP|S t|tslJ |dd  dvrx|d	7 }|S )
Nr   r   r!   r   )r   r    r"   r   _r`   z)}$?\.+*$)dictrT   r0   rl   popr5   itemsstr)r)   r   
map2originrT   r0   	map_marchmap_cckeyregexkvr   r   r   	arg_regex   s<   




z_Test_CCompilerOpt.arg_regexr   c                 K   s   | j d	i |}|d u rd S | j|||dd|ddd}d| }|s6t|dkr4td| d S t||tj	sFtd||f d S )
Nr*   r   r+   rZ   r4   r   !expected empty features, not "%s"z%dispatch features "%s" not match "%s"r   )
r   rQ   rl   r;   cpu_dispatch_namesr<   r   r7   r8   
IGNORECASE)r)   rX   rV   r   r8   rR   featuresr   r   r   expect   (   


z_Test_CCompilerOpt.expectc                 K   s   | j d	i |}|d u rd S | j|||dd|ddd}d| }|s6t|dkr4td| d S t||tj	sFtd||f d S )
Nr*   r   r+   rZ   r4   r   r   z%baseline features "%s" not match "%s"r   )
r   rQ   rl   r;   cpu_baseline_namesr<   r   r7   r8   r   )r)   rV   rX   r   r8   rR   r   r   r   r   expect_baseline   r   z"_Test_CCompilerOpt.expect_baselinec                 K   s   | j d	i |}|d u rd S | j|||dd|ddd}d| }|s6t|dkr4td| d S t||sDtd||f d S )
Nr*   r   r+   rZ   r4   r   zexpected empty flags not "%s"zflags "%s" not match "%s"r   )	r   rQ   rl   r;   cpu_baseline_flagsr<   r   r7   r8   )r)   rV   rX   r   r8   rR   r>   r   r   r   expect_flags   s(   


z_Test_CCompilerOpt.expect_flagsc                 K   s   | j di |}|d u rd S | jd||d|\}}d|}|s0t|dkr.td| d S t||tjs@td||f d S )Nrw   rx   r4   r   z expected empty targets, not "%s"ztargets "%s" not match "%s"r   )r   r   r;   r<   r   r7   r8   r   )r)   rw   rx   r   r8   r   r   r   r   expect_targets   s    

z!_Test_CCompilerOpt.expect_targetsc           
      K   s   | j di |}|d u rd S t|tsJ | j||d\}}| D ]/\}}||vr0td| || }	|sBt|	dkrBtd| t||	sQtd||	|f q"d S )Nr   zexpected to find target "%s"r   z+expected to find empty flags in target "%s"z"%s" flags "%s" not match "%s"r   )	r   r5   r   r   r   r   r<   r7   r8   )
r)   rw   rx   r   
match_dictr   	tar_flags	match_tarmatch_flagsr>   r   r   r   expect_target_flags   s,   z&_Test_CCompilerOpt.expect_target_flagsc                 C   s   | j dkrdnd}| jdkrdnd}|  }tt|d| j   tt|d|   tt|d| j  tt|d|   d S )Nr   r   r   r   cc_on_cc_is_)rO   rP   rR   r   getattr)r)   
wrong_archwrong_ccrR   r   r   r   test_interface  s   z!_Test_CCompilerOpt.test_interfacec                 C   sH   dD ]\}}| j ||d}t| dksJ t| dks!J qd S )N))r   nonerN   )z
none +noneznone - none)z	none -maxz	min - max)z+vsx2 -VSX2zvsx avx2 avx512f -max)z#max -vsx - avx + avx512f neon -MAX z+min -min + max -max -vsx + avx2 -avx2 +NONEr[   r\   r   )rQ   r<   r   r   )r)   rV   rX   rR   r   r   r   test_args_empty  s
   	z"_Test_CCompilerOpt.test_args_emptyc              	   C   sJ   |   dkrd S dD ]\}}z| j||d td ty"   Y q
w d S )Nunknown))zunkown_feature - max +minzunknown max min)z#avx2z$vsxr   z+excepted an exception for invalid arguments)rT   rQ   r   r   )r)   rV   rX   r   r   r   test_args_validation-  s   z'_Test_CCompilerOpt.test_args_validationc                 C   sT   | j dddddd | j ddd	d
dd | j dddddd | j dddddd d S )Nzsse vsx neonssevsxneonr   )r   r   r!   r   z)sse41 avx avx2 vsx2 vsx3 neon_vfpv4 asimdzsse41 avx avx2	vsx2 vsx3zneon_vfpv4 asimdzsse neon vsx)rV   r   r   r!   zavx2 vsx3 asimdhp)r   r2   r   r   r   	test_skip;  s&   
z_Test_CCompilerOpt.test_skipc                 C   s   | j ddddd 	 dD ] \}}d||f }| j |d| ||d	 | j |d
| ||d	 qdD ]}|D ]}| j |dd| d q3q/| j ddd dD ]	}| j |dd qLd S )Nzfma3 avx2 asimd vsx3zsse .* sse41 .* fma3.*avx2zvsx vsx2 vsx3zneon neon_fp16 neon_vfpv4 asimd)r   r   r!   )fma3avx2)avx512favx512cdz.* sse42 .* %s .*%s$z.* sse42 .* %s$)x86_gccx86_iccx86_iccwz.* avx .* %s$)r   )r   r   
avx512_skxz.*%sr4   )x86_msvcr   vsx vsx2)r    )r   	neon_fp16
neon_vfpv4asimd)r"   )r   r;   )r)   f0f1diffr@   ffr   r   r   test_impliesS  s6   z_Test_CCompilerOpt.test_impliesc                 C   s  dD ]=}|dkr|   dkrq| j|dddddd | j|ddd	d
dddd | j|dddddd | j|dddddddd q| jddddddddd | jddddd z| jddd d d d d d! |  d"krqtd#|   W d S  ty   |  d"krtd$Y d S w )%N)rY   nativer   r   z.*cpu_(sse|vsx|neon|vx).cr   )r*   r   r   r!   r#   z".*cpu_(sse3|vsx2|neon_vfpv4|vxe).czsse sse2r   zneon neon_fp16vx)r*   r   r   r!   r"   r    r#   z.*cpu_(popcnt|vsx3).czsse .* sse41r   zneon neon_fp16 .* asimd .*vx vxe vxe2z=.* 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 .*zvsx vsx2 vsx3 vsx4.*zvx vxe vxe2.*)r   r   r   r   r!   r   r#   rW   zsse sse2 sse3zneon neon_fp16 .* asimd)r   r   r!   r"   r   r    r#   z.*cpu_(sse2|vsx2).c)r*   r   r    z..*(-march=native|-xHost|/QxHost|-mcpu=a64fx).*.*)r+   r   r   r!   r#   r"   r   excepted an exception for %sexcepted no exceptions)r0   r   rT   r   r   )r)   or   r   r   test_args_options|  sf   

z$_Test_CCompilerOpt.test_args_optionsc                 C   s   | j dddd|  dkrdnddddddd	
 | j d
ddd | j dddd | j ddd | j ddd | j ddd | j ddd d S )Nz'sse sse2 vsx vsx2 neon neon_fp16 vx vxez-msse -msse2z
/arch:SSE2r   r   z-mcpu=power8z"-mfpu=neon-fp16 -mfp16-format=ieeez-mzvector -march=arch12)	r   r   r   r   	ppc64_gccppc64_clang	armhf_gccr"   r#   r   z;-mfp16-format=ieee -mfpu=neon-fp-armv8 -march=armv8-a\+simd)r"   r   asimdhpz-march=armv8.2-a\+fp16z=-mfp16-format=ieee -mfpu=neon-fp-armv8 -march=armv8.2-a\+fp16)aarch64_gccr   asimddpz-march=armv8.2-a\+dotprod)r   asimdfhmz-march=armv8.2-a\+fp16\+fp16fmlzasimddp asimdhp asimdfhmz(-march=armv8.2-a\+dotprod\+fp16\+fp16fmlr   z-mzvector -march=arch13)r#   )r   rT   r2   r   r   r   
test_flags  sF   
z_Test_CCompilerOpt.test_flagsc              	   C   sh   dD ]/}z| j |ddddd |  dkrtd|   W q ty1   |  dkr/tdY qw d S )N)zbla 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   )r   r!   r   r#   r   r   r   )r   rT   r   r   r)   rw   r   r   r   test_targets_exceptions  s"   
z*_Test_CCompilerOpt.test_targets_exceptionsc              	   C   s$   dD ]}| j |dddddd qd S )N)z+/*@targets $keep_baseline sse vsx neon vx*/z+/*@targets,$keep_baseline,sse,vsx,neon vx*/z+/*@targets*$keep_baseline*sse*vsx*neon*vx*/zs
            /*
            ** @targets
            ** $keep_baseline, sse vsx,neon, vx
            */
            z
            /*
            ************@targets****************
            ** $keep_baseline, sse vsx, neon, vx
            ************************************
            */
            z
            /*
            /////////////@targets/////////////////
            //$keep_baseline//sse//vsx//neon//vx
            /////////////////////////////////////
            */
            zj
            /*
            @targets
            $keep_baseline
            SSE VSX NEON VX*/
            r   r   r   r   r   )r   r   r!   r#   r   r   r   r   r   r   test_targets_syntax  s
   
z&_Test_CCompilerOpt.test_targets_syntaxc                 C   sh   | j ddddddd | j dd	d
ddddd | j dd	dddddd | j dd	ddddddddd
 d S )Nz
            /*@targets
                sse sse2 sse41 avx avx2 avx512f
                vsx vsx2 vsx3 vsx4
                neon neon_fp16 asimdhp asimddp
                vx vxe vxe2
            */
            zavx vsx2 asimd vx vxeavx512f avx2zasimddp asimdhpz	vsx4 vsx3vxe2)rV   r   r!   r   r#   z
            /*@targets
                sse41 avx avx2 avx512f
                vsx2 vsx3 vsx4
                asimd asimdhp asimddp
                vx vxe vxe2
            */
            r   z"sse41 avx2 vsx2 asimd asimddp vxe2z
avx2 sse41asimddp asimdvsx2)rV   rX   r   r!   r   r#   z
            /*@targets
                sse2 sse41 avx2 avx512f
                vsx2 vsx3 vsx4
                neon asimdhp asimddp
                vx vxe vxe2
            */
            z).*(avx2|avx512f|vsx3|vsx4|asimddp|vxe2).cz
sse41 sse2zasimdhp neonzvxe vx)rV   r*   r   r   r!   r#   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 sse2zavx512cd avx2 avx sse2zvsx3 vsx2 vsx	vsx3 vsx2z8asimdfhm asimddp asimdhp asimd neon_vfpv4 neon_fp16 neonzasimdfhm asimddp asimdhp asimd)	rV   r   r   r   r   r   r    r!   r"   r   r2   r   r   r   test_targets  s<   
z_Test_CCompilerOpt.test_targetsc              
   C   s   | j dddddddd | j d	d
ddddd | j dddd|  dkr%dnddddd dD ]}| jd| ddiddiddiddiddid q.| jdddiddidd idd!iddid d S )"Nz
            /*@targets
                $keep_baseline
                sse2 sse42 avx2 avx512f
                vsx2 vsx3
                neon neon_vfpv4 asimd asimddp
                vx vxe vxe2
            */
            zsse41 avx2 vsx2 asimd vsx3 vxezavx512f avx2 sse42 sse2r   zasimddp asimd neon_vfpv4 neonr   zvxe2 vxe vx)rV   r   r   r!   r"   r#   z
            /*@targets
                $keep_baseline $keep_sort
                avx512f sse42 avx2 sse2
                vsx2 vsx3
                asimd neon neon_vfpv4 asimddp
                vxe vxe2
            */
            zavx512f sse42 avx2 sse2r   zasimd neon neon_vfpv4 asimddpzasimd asimddpzvxe vxe2)r   r   r!   r"   r#   z
            /*@targets
                $keep_baseline $keep_sort $autovec
                avx512f avx2 sse42 sse41 sse2
                vsx3 vsx2
                asimddp asimd neon_vfpv4 neon
            */
            zavx512f avx2 sse42 sse41 sse2r   zavx512f avx2 sse2r   )r   r   r   r   r   r!   r"   )z$maxoptz$autovecz/*@targets baseline %s */rV   z.*-O3.*z.*/O3.*z.*/O2.*r   )r   r   r   r   r   z/*@targets baseline $werror */z.*-Werror.*z.*/Werror.*z.*/WX.*)r   rT   r   )r)   policyr   r   r   test_targets_policies]  sT   		
z(_Test_CCompilerOpt.test_targets_policiesc              	   C   s>   | j dtdddddd | j dtd	d
ddddddd d S )NzK
            /*@targets $keep_baseline baseline #test_group */
            z
                    $keep_baseline
                    asimddp sse2 vsx2 avx2 vsx3
                    avx512f asimdhp
                )
test_groupzavx512f avx2 sse2 baselinezvsx3 vsx2 baselinezasimddp asimdhp baseline)rx   r   r   r!   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_2zavx512f avx2 avx sse42 sse41r   vsx3zasimdfhm asimddp asimdzasimdfhm asimddp)rx   r   r   r    r!   r"   )r   r   r2   r   r   r   test_targets_groups  s*   	
z&_Test_CCompilerOpt.test_targets_groupsc                 C   sP   | j dddd | j dddddd	 | j d
ddddd | j dddddd d S )Nzm
            /*@targets
                (avx512_clx avx512_cnl) (asimdhp asimddp)
            */
            z\(avx512_clx avx512_cnl\)z\(asimdhp asimddp\))r   r!   z
            /*@targets
                f16c (sse41 avx sse42) (sse3 avx2 avx512f)
                vsx2 (vsx vsx3 vsx2)
                (neon neon_vfpv4 asimd asimdhp asimddp)
            */
            zavx512f f16c avxr   r   )r   r   r    r!   z
            /*@targets $keep_sort
                (sse41 avx sse42) (sse3 avx2 avx512f)
                (vsx vsx3 vsx2)
                (asimddp neon neon_vfpv4 asimd asimdhp)
                (vx vxe vxe2)
            */
            zavx avx512fr   )r   r   r!   r#   zz
            /*@targets $keep_sort
                fma3 avx2 (fma3 avx2) (avx2 fma3) avx2 fma3
            */
            zfma3 avx2 \(fma3 avx2\)r   )r   r   r   r   r   r2   r   r   r   test_targets_multi  s2   

z%_Test_CCompilerOpt.test_targets_multir   )rF   rG   rH   rO   rP   rM   rQ   rR   rT   r0   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rJ   M   s8    ,


	)8'$@L,rJ   c                 C   s@   t rtdj| d | | |dS tdj| d | | |dS )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_class()
    r   )
class_namerO   rP   zo    class TestCCompilerOpt_{class_name}(_Test_CCompilerOpt):
        arch = '{arch}'
        cc   = '{cc}'
    )is_standaloner,   r-   r.   )rO   rP   r   r   r   new_test  s   
r   r   )%r7   r,   rm   r   r   distutils.errorsr   rF   __package__r   unittest
contextlibr   r
   rt   abspathr;   dirname__file__ccompiler_optr   contextmanagerr   r   numpy.distutils.ccompiler_optnumpy.testingr   arch_compilersr%   rJ   r   r   rO   	compilersrP   execmainr   r   r   r   <module>   sN      
&     @	