a
    jUbl                  	   @   sF  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oBedu Z	e	rd 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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" qqe	rBe
$  dS )    N)syspath)DistutilsError__main__z..)CCompilerOptc               	   o   s6   t j| i |}z|V  W t| nt| 0 d S N)tempfileZmkdtempshutilZrmtree)argskwargstmpdir r   Glib/python3.9/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   )x86x64ppc64ppc64learmhfaarch64Z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_nameZreportr$   r   r   r   __repr__-   s    
zFakeCCompilerOpt.__repr__c                 K   s   t |tsJ t |tsJ | jrD|D ]}t| j|r&| d q&| jrl|D ]}t| j|rN| d qNt|d|gt	| S )Nz%source is trapped by a fake interfacez#flag is trapped by a fake interface )

isinstancelistr!   rematchZ
dist_errorr"   zipjoinlen)r$   Zsourcesflagsr   srcfr   r   r   dist_compile7   s    zFakeCCompilerOpt.dist_compilec                 C   s   t jS r   )r    	fake_infor,   r   r   r   	dist_infoE   s    zFakeCCompilerOpt.dist_infoF)stderrc                 G   s   d S r   r   )r<   r
   r   r   r   dist_logH   s    zFakeCCompilerOpt.dist_logN)r   r   )
__name__
__module____qualname__r:   r#   r-   r9   r;   staticmethodr=   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d6ddZd7d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 )8_Test_CCompilerOptNc                 C   s   dt _d | _d S )NT)r    Zconf_nocache_optr,   r   r   r   setupP   s    z_Test_CCompilerOpt.setupc                 O   s   | j | jdft_t|i |S Nr   )archccr    r:   )r$   r
   r   r   r   r   noptT   s    z_Test_CCompilerOpt.noptc                 C   s   | j s|  | _ | j S r   )rC   rH   r,   r   r   r   optX   s    
z_Test_CCompilerOpt.optc                 C   s
   |   jS r   )rI   r*   r,   r   r   r   march]   s    z_Test_CCompilerOpt.marchc                 C   s
   |   jS r   )rI   r+   r,   r   r   r   r+   `   s    z_Test_CCompilerOpt.cc_namec              	      s  |t _| j|dd|dd|dd|ddd}t }tj|d	}t|d
}|	| W d    n1 sx0    Y  g  i }|
|g}	|	D ]t\}
}t|
ddd }t|}|dkrd}n,|dkr|d  }ndd| d  } | |||< qW d    n1 s&0    Y  |j| \}}|rN|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   (r.   )c                 S   s,   g | ]$}t |tr$d d| d n|qS )rV   r.   rW   )r/   tupler4   ).0Ztarr   r   r   
<listcomp>   s   z2_Test_CCompilerOpt.get_targets.<locals>.<listcomp>c                 3   s   | ]}| v V  qd S r   r   )rY   tZgtargetsr   r   	<genexpr>       z1_Test_CCompilerOpt.get_targets.<locals>.<genexpr>zM'sources_status' returns different targets than the compiled targets
%s != %s)r    Zconf_target_groupsrH   getr   osr   r4   openwriteZtry_dispatchbasenamesplitr5   upperappendZsources_statusallr   )r$   targetsgroupsr   rI   r   filer8   ZgflagsZfake_objectssourcer6   ZgtarZglenZhas_baseliner   r\   r   get_targetsc   sH    



(
**z_Test_CCompilerOpt.get_targetsc              	   K   s   t ddddd}|  }|  }|||}|||}|||||d | |d | |d | |d | fD ]}||d }|d url qql|rt|t r| D ]$\}	}
|
dd  dvr|
d	 ||	< qn&t|tsJ |dd  dvr|d	7 }|S )
Nr   r   r   r   )r   r   r   r   _rU   z)}$?\.+*$)dictrJ   r+   r_   popr/   itemsstr)r$   r   Z
map2originrJ   r+   Z	map_marchZmap_cckeyZregexkvr   r   r   	arg_regex   s6    




z_Test_CCompilerOpt.arg_regexr   c                 K   s   | j f i |}|d u rd S | j|||dd|ddd}d| }|slt|dkrhtd| d S t||tj	std||f d S )	Nr%   r   r&   rO   r.   r   !expected empty features, not "%s"z%dispatch features "%s" not match "%s")
rv   rH   r_   r4   cpu_dispatch_namesr5   r   r1   r2   
IGNORECASE)r$   rM   rK   r   r2   rI   featuresr   r   r   expect   s&    


z_Test_CCompilerOpt.expectc                 K   s   | j f i |}|d u rd S | j|||dd|ddd}d| }|slt|dkrhtd| d S t||tj	std||f d S )	Nr%   r   r&   rO   r.   r   rw   z%baseline features "%s" not match "%s")
rv   rH   r_   r4   cpu_baseline_namesr5   r   r1   r2   ry   )r$   rK   rM   r   r2   rI   rz   r   r   r   expect_baseline   s&    


z"_Test_CCompilerOpt.expect_baselinec                 K   s   | j f i |}|d u rd S | j|||dd|ddd}d| }|slt|dkrhtd| d S t||std||f d S )	Nr%   r   r&   rO   r.   r   zexpected empty flags not "%s"zflags "%s" not match "%s")	rv   rH   r_   r4   Zcpu_baseline_flagsr5   r   r1   r2   )r$   rK   rM   r   r2   rI   r6   r   r   r   expect_flags   s&    


z_Test_CCompilerOpt.expect_flagsc                 K   s   | j f i |}|d u rd S | jf ||d|\}}d|}|s`t|dkr\td| d S t||tjstd||f d S )Nrh   ri   r.   r   z expected empty targets, not "%s"ztargets "%s" not match "%s")rv   rl   r4   r5   r   r1   r2   ry   )r$   rh   ri   r   r2   rm   r   r   r   expect_targets   s    

z!_Test_CCompilerOpt.expect_targetsc           
      K   s   | j f i |}|d u rd S t|ts*J | j||d\}}| D ]^\}}||vr`td| || }	|st|	dkrtd| t||	sDtd||	|f qDd 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")	rv   r/   ro   rl   rq   r   r5   r1   r2   )
r$   rh   ri   r   Z
match_dictrm   Z	tar_flagsZ	match_tarZmatch_flagsr6   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   Zcc_on_Zcc_is_)rF   rG   rI   r   getattr)r$   Z
wrong_archZwrong_ccrI   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   ZnonerE   )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rP   rQ   r   )rH   r5   r|   rx   )r$   rK   rM   rI   r   r   r   test_args_empty  s    	z"_Test_CCompilerOpt.test_args_emptyc              	   C   sP   |   dkrd S dD ]6\}}z| j||d tdW q tyH   Y q0 qd S )Nunknown))zunkown_feature - max +minzunknown max min)z#avx2z$vsxr   z+excepted an exception for invalid arguments)rJ   rH   r   r   )r$   rK   rM   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)rK   r   r   r   zavx2 vsx3 asimdhp)r{   r,   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 qdq\| j ddd dD ]}| j |dd qd S )Nzfma3 avx2 asimd vsx3zsse .* sse41 .* fma3.*avx2zvsx vsx2 vsx3zneon neon_fp16 neon_vfpv4 asimdr   r   r   )Zfma3avx2)avx512favx512cdz.* sse42 .* %s .*%s$z.* sse42 .* %s$)x86_gccx86_iccx86_iccwz.* avx .* %s$)r   )r   r   Z
avx512_skxz.*%sr.   )x86_msvcr   vsx vsx2)r   )r   Z	neon_fp16Z
neon_vfpv4asimd)r   )r}   r4   )r$   Zf0f1Zdiffr8   Zffr   r   r   test_impliesR  s0    
z_Test_CCompilerOpt.test_impliesc              
   C   s  dD ]r}|dkr|   dkrq| j|ddddd | j|ddd	d
ddd | j|ddddd | j|ddddddd q| jdddddddd | jddddd z4| jdddddd |  dkrtd |   W n& ty   |  dkrtd!Y n0 d S )"N)rN   nativer   r   z.*cpu_(sse|vsx|neon).cr   )r%   r   r   r   z.*cpu_(sse3|vsx2|neon_vfpv4).czsse sse2r   zneon neon_fp16)r%   r   r   r   r   r   z.*cpu_(popcnt|vsx3).czsse .* sse41r   zneon 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 .*zvsx vsx2 vsx3.*)r   r   r   r   r   r   rL   zsse sse2 sse3zneon neon_fp16 .* asimd)r   r   r   r   r   r   z.*cpu_(sse2|vsx2).c)r%   r   r   z".*(-march=native|-xHost|/QxHost).*.*)r&   r   r   r   r   excepted an exception for %sexcepted no exceptions)r+   r{   rJ   r   r   )r$   or   r   r   test_args_options{  s\    
z$_Test_CCompilerOpt.test_args_optionsc                 C   sj   | j ddd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 d S )Nz sse sse2 vsx vsx2 neon neon_fp16z-msse -msse2z
/arch:SSE2z-mcpu=power8z-maltivec -mvsx -mpower8-vectorz"-mfpu=neon-fp16 -mfp16-format=ieeer   )r   r   r   r   Z	ppc64_gccZppc64_clang	armhf_gccr   r   z;-mfp16-format=ieee -mfpu=neon-fp-armv8 -march=armv8-a\+simd)r   r   Zasimdhpz-march=armv8.2-a\+fp16z=-mfp16-format=ieee -mfpu=neon-fp-armv8 -march=armv8.2-a\+fp16)aarch64_gccr   Zasimddpz-march=armv8.2-a\+dotprod)r   Zasimdfhmz-march=armv8.2-a\+fp16\+fp16fmlzasimddp asimdhp asimdfhmz(-march=armv8.2-a\+dotprod\+fp16\+fp16fml)r~   r,   r   r   r   
test_flags  s:    
z_Test_CCompilerOpt.test_flagsc              	   C   sh   dD ]^}z2| j |dddd |  dkr8td|   W q ty`   |  dkr\tdY q0 q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   rJ   r   r   r$   rh   r   r   r   test_targets_exceptions  s    
z*_Test_CCompilerOpt.test_targets_exceptionsc                 C   s"   dD ]}| j |ddddd qd S )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*/
            r   r   r   r   r   r   r   r   r   r   test_targets_syntax  s    z&_Test_CCompilerOpt.test_targets_syntaxc                 C   sb   | j dddddd | j ddd	d
ddd | j 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
                neon neon_fp16 asimdhp asimddp
            */
            zavx vsx2 asimdzavx512f avx2zasimddp asimdhpvsx3)rK   r   r   r   z
            /*@targets
                sse41 avx avx2 avx512f
                vsx2 vsx3
                asimd asimdhp asimddp
            */
            r   zsse41 avx2 vsx2 asimd asimddpz
avx2 sse41asimddp asimdZvsx2)rK   rM   r   r   r   z
            /*@targets
                sse2 sse41 avx2 avx512f
                vsx2 vsx3
                neon asimdhp asimddp
            */
            z.*(avx2|avx512f|vsx3|asimddp).cz
sse41 sse2zasimdhp neon)rK   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)	rK   r   r   r   r   r   r   r   r   r   r,   r   r   r   test_targets  s8    z_Test_CCompilerOpt.test_targetsc              
   C   s   | j ddddddd | j dd	d
ddd | j ddddddddd dD ]2}| jd| ddiddiddiddiddid qH| 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
            */
            zsse41 avx2 vsx2 asimd vsx3zavx512f avx2 sse42 sse2r   zasimddp asimd neon_vfpv4 neonr   )rK   r   r   r   r   z
            /*@targets
                $keep_baseline $keep_sort
                avx512f sse42 avx2 sse2
                vsx2 vsx3
                asimd neon neon_vfpv4 asimddp
            */
            zavx512f sse42 avx2 sse2r   zasimd neon neon_vfpv4 asimddpzasimd asimddp)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 sse2zavx512f avx2 sse2)r   r   r   r   r   r   r   )z$maxoptz$autovecz/*@targets baseline %s */rK   z.*-O3.*z.*/O3.*z.*/O2.*r   )r   r   r   r   r   z/*@targets baseline $werror */z.*-Werror.*z.*/Werror.*z.*/WX.*)r   r   )r$   Zpolicyr   r   r   test_targets_policiesO  sL    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
                )Z
test_groupzavx512f avx2 sse2 baselinezvsx3 vsx2 baselinezasimddp asimdhp baseline)ri   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
                )Ztest_group_1Ztest_group_2zavx512f avx2 avx sse42 sse41r   r   zasimdfhm asimddp asimdzasimdfhm asimddp)ri   r   r   r   r   r   )r   ro   r,   r   r   r   test_targets_groups  s*    	z&_Test_CCompilerOpt.test_targets_groupsc                 C   sN   | j dddd | j dddddd	 | j 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)
            */
            zavx avx512fr   zz
            /*@targets $keep_sort
                fma3 avx2 (fma3 avx2) (avx2 fma3) avx2 fma3
            */
            zfma3 avx2 \(fma3 avx2\)r   )r   r   r   r   r   r,   r   r   r   test_targets_multi  s0    
z%_Test_CCompilerOpt.test_targets_multi)r   )r   )r   )r>   r?   r@   rF   rG   rD   rH   rI   rJ   r+   rl   rv   r{   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rB   L   s6   ,


	)6!$;G,rB   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()
    rm   )
class_namerF   rG   zo    class TestCCompilerOpt_{class_name}(_Test_CCompilerOpt):
        arch = '{arch}'
        cc   = '{cc}'
    )is_standaloner'   r(   r)   )rF   rG   r   r   r   new_test  s    

r   )r   )%r1   r'   r`   r   r   Zdistutils.errorsr   r>   __package__r   Zunittest
contextlibr   r	   rf   abspathr4   dirname__file__Zccompiler_optr   contextmanagerr   r   Znumpy.distutils.ccompiler_optZnumpy.testingro   Zarch_compilersr    rB   r   rq   rF   Z	compilersrG   execmainr   r   r   r   <module>   sD     

&     ,