U
    #ch                     @   s@  d dl Z d dlZd dlZd dlZd dlZd dlmZmZmZ d dl	m
Z
 d+ddZG dd dZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deZG dd deZdZdZdZee ZeeeeeededeeeiZe D ]@\ZZerejndZedZeedkr>dd e dZned  ZdZ!e" Z#esdd e d!Z!nFejszd e d"Z!n0ej$sd e d#e#d$< ej%sd e d%e#d&< e D ]\Z&Z'e&D ]tZ(e#)e(e!Z*e'fZ+e"ee e(ed'Z,e-d(e'j. d)e d)e d)e( e+e,Z/e*r$e j0j!e*d*e/ e/e1 e/j.< qq qdS ),    N)targetsclear_floatstatusget_floatstatus)__cpu_baseline__Fc                 C   sf   t  }|s| o|d@ dk}||s$|o.|d@ dkO }||s<|oF|d@ dkO }||sT|o^|d@ dkO }|S )N   r            )r   )Z	divbyzeroZoverflowZ	underflowinvalidallerrret r   >/tmp/pip-unpacked-wheel-b2rbor69/numpy/core/tests/test_simd.pycheck_floatstatus	   s    r   c                   @   s   e Zd ZdZdZdZdd Zd!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d Zdd Zdd  ZdS )"_Test_UtilityNc                 C   s   t | j|d | j S )z
        To call NPV intrinsics without the attribute 'npyv' and
        auto suffixing intrinsics according to class attribute 'sfx'
        _getattrnpyvsfx)selfattrr   r   r   __getattr__   s    z_Test_Utility.__getattr__Fc                 C   sR   |dkrd}|dkr| j }t||| }|r4t|}|  rJdd |D S t|S )z[
        Create list of consecutive numbers according to number of vector's lanes.
        Nr   c                 S   s   g | ]}|d  qS )      ?r   .0xr   r   r   
<listcomp>2   s     z'_Test_Utility._data.<locals>.<listcomp>)nlanesrangereversed_is_fplistr   startcountreverserngr   r   r   _data&   s    z_Test_Utility._datac                 C   s   | j d dkS )Nr   ur   r   r   r   r   _is_unsigned5   s    z_Test_Utility._is_unsignedc                 C   s   | j d dkS )Nr   sr+   r,   r   r   r   
_is_signed8   s    z_Test_Utility._is_signedc                 C   s   | j d dkS )Nr   fr+   r,   r   r   r   r"   ;   s    z_Test_Utility._is_fpc                 C   s   t | jdd  S )Nr   )intr   r,   r   r   r   _scalar_size>   s    z_Test_Utility._scalar_sizec                    s0   |   r|S |   |   fdd|D S )Nc                    s   g | ]}t t| qS r   )minmax)r   vZmax_intZmin_intr   r   r   F   s     z+_Test_Utility._int_clip.<locals>.<listcomp>)r"   _int_max_int_min)r   seqr   r6   r   	_int_clipA   s
    z_Test_Utility._int_clipc                 C   s4   |   rd S | | dd }|  r0|d S |S )Nr   r   )r"   _to_unsignedsetallr/   )r   Zmax_ur   r   r   r7   H   s    z_Test_Utility._int_maxc                 C   s&   |   rd S |  rdS |  d  S )Nr   r   )r"   r-   r7   r,   r   r   r   r8   P   s
    z_Test_Utility._int_minc                 C   s&   t | jd| jdd   d}|d S )Nsetall_ur   r;   r   r   )r   Z	max_unsigr   r   r   
_true_maskW   s    z_Test_Utility._true_maskc                 C   st   t |ttfr,t| jd| jdd   |S |jdd}|d dkrLd}nd}t| j||dd  ||S d S )	Nload_ur   npyv_ r   bzcvt_u{0}_b{0}zreinterpret_u{0}_{1})	
isinstancer#   tupler   r   r   __name__replaceformat)r   vectorr   Z
cvt_intrinr   r   r   r<   [   s    z_Test_Utility._to_unsignedc                 C   s   t dS Ninffloatr,   r   r   r   
_pinfinityf   s    z_Test_Utility._pinfinityc                 C   s
   t d S rJ   rL   r,   r   r   r   
_ninfinityi   s    z_Test_Utility._ninfinityc                 C   s   t dS )NnanrL   r,   r   r   r   _nanl   s    z_Test_Utility._nanc                 C   s(   | j }|dkrt}n
|d}d|S )NZbaseline__ )target_namer   splitjoin)r   targetr   r   r   _cpu_featureso   s
    
z_Test_Utility._cpu_features)NNF)rF   
__module____qualname__r   r   rT   r   r)   r-   r/   r"   r2   r:   r7   r8   r?   r<   rN   rO   rQ   rX   r   r   r   r   r      s$   
r   c                   @   s~   e Zd ZdZdd ZdddZdd	 Zd
d Zdd Zdd Z	e
jdddge
jdddgddgdgdgfdd ZdS )
_SIMD_BOOLz2
    To test all boolean vector types at once
    c                 C   s   t | jd| jdd   S )NZnlanes_ur   r   r,   r   r   r   _nlanes{   s    z_SIMD_BOOL._nlanesNFc                    s2   |    t|  }|r t|} fdd|D S )Nc                    s   g | ]}|d  r ndqS )r   r   r   r   	true_maskr   r   r      s     z$_SIMD_BOOL._data.<locals>.<listcomp>)r?   r    r\   r!   r$   r   r]   r   r)   ~   s
    z_SIMD_BOOL._datac                 C   sB   | j dd  }t| jd| }t| jd| d| }|||S )Nr   r@   Zcvt_bZ_u)r   r   r   )r   datalen_strloadcvtr   r   r   _load_b   s    z_SIMD_BOOL._load_bc                 C   sz  |   }| j dd}| |}| |}dd t||D }t| d||}||ksXtdd t||D }t| d||}||kstdd t||D }	t| d	||}
|
|	kstt| d
|}||kst| jdkrdS dd t||D }t| d||}||kstdd t||D }t| d||}||ksDtdd t||D }t| d||}||ksvtd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
        Tr'   c                 S   s   g | ]\}}||@ qS r   r   r   arC   r   r   r   r      s     z5_SIMD_BOOL.test_operators_logical.<locals>.<listcomp>andc                 S   s   g | ]\}}||B qS r   r   re   r   r   r   r      s     orc                 S   s   g | ]\}}||A qS r   r   re   r   r   r   r      s     xornotb8Nc                 S   s   g | ]\}}|| @ d @ qS    r   re   r   r   r   r      s     andcc                 S   s   g | ]\}}|| B d @ qS rl   r   re   r   r   r   r      s     Zorcc                 S   s   g | ]\}}||A  d @ qS rl   r   re   r   r   r   r      s     Zxnor)r)   rc   zipr   AssertionErrorr   )r   data_adata_bvdata_avdata_bdata_andvanddata_orvordata_xorvxorvnot	data_andcvandcZdata_orcZvorcZ	data_xnorZvxnorr   r   r   test_operators_logical   s4    


z!_SIMD_BOOL.test_operators_logicalc                 C   sZ   dd }|   | j ddfD ]8}| |}||}| |}t|}|t|kstqd S )Nc                 S   s   t dd t| dD S )Nc                 S   s    g | ]\}}t |d k|> qS )r   r1   )r   ir   r   r   r   r      s     z<_SIMD_BOOL.test_tobits.<locals>.<lambda>.<locals>.<listcomp>r   )sum	enumerate)r_   r   r   r   <lambda>       z(_SIMD_BOOL.test_tobits.<locals>.<lambda>Trd   )r)   rc   tobitsbinrp   )r   Z	data2bitsr_   vdataZ	data_bitsr   Z
bin_tobitsr   r   r   test_tobits   s    

z_SIMD_BOOL.test_tobitsc              	   C   s
  | j dkrdS |  }| jdd}| |}| |}t| jd| j  }| j dkrzdd t|t| D }|||}n~| j d	krd
d dt| dt|  D }|||||}nB| j dkrdd dt| dt|  D }|||||||||}||kstdS )z
        Pack multiple vectors into one
        Test intrinsics:
            npyv_pack_b8_b16
            npyv_pack_b8_b32
            npyv_pack_b8_b64
        )b16b32b64NTrd   Zpack_b8_r   c                 S   s   g | ]}|d @ qS rl   r   r   r   r   r   r   r      s     z(_SIMD_BOOL.test_pack.<locals>.<listcomp>r   c                 S   s   g | ]}|d @ qS rl   r   r   r   r   r   r      s     r   r   c                 S   s   g | ]}|d @ qS rl   r   r   r   r   r   r      s     r   )r   r)   rc   r   r   r#   rp   )r   r_   rdatar   ZvrdataZ	pack_simdZspackZvpackr   r   r   	test_pack   s,    




"
"
   z_SIMD_BOOL.test_packintrinanyr   r_   r;   r   c                 C   sD   |  ||   }t|}t| |}||}||}||ks@tdS zX
        Test intrinsics:
            npyv_any_##SFX
            npyv_all_##SFX
        N)rc   r\   evalr   rp   r   r   r_   rq   funcdesiredsimdr   r   r   test_operators_crosstest   s    
z#_SIMD_BOOL.test_operators_crosstest)NNF)rF   rY   rZ   __doc__r\   r)   rc   r~   r   r   pytestmarkparametrizer   r   r   r   r   r[   w   s   
+	r[   c                   @   sH   e Zd ZdZdd Zdd Zdd Zej	dd	d
dddgdd Z
dS )	_SIMD_INTz2
    To test all integer vector types at once
    c                    s6  | j dkrd S | |  | j }| j|  dd}| || | }}t|  D ]d |  fdd|D }| | }||kst	|  fdd|D }| 
| }||ksVt	qVtd|  D ]f |  fdd|D }| | }	|	|ks t	|  fd	d|D }| | }
|
|kst	qd S )
N)u8s8Trd   c                    s   g | ]}| > qS r   r   r   rf   r&   r   r   r      s     z2_SIMD_INT.test_operators_shift.<locals>.<listcomp>c                    s   g | ]}| ? qS r   r   r   r   r   r   r     s     r   c                    s   g | ]}| > qS r   r   r   r   r   r   r     s     c                    s   g | ]}| ? qS r   r   r   r   r   r   r     s     )r   r)   r7   r   r8   ra   r    r2   shlrp   shrshlishri)r   rq   rr   rs   rt   Z
data_shl_ar   Z
data_shr_ar   r   r   r   r   r   test_operators_shift   s&    
z_SIMD_INT.test_operators_shiftc           	      C   s   | j dkrd S | |  | j }| j|  dd}| || | }}| dd t||D }| ||}||ks|t	| dd t||D }| 
||}||kst	d S )N)u32s32u64s64Trd   c                 S   s   g | ]\}}|| qS r   r   re   r   r   r   r     s     z>_SIMD_INT.test_arithmetic_subadd_saturated.<locals>.<listcomp>c                 S   s   g | ]\}}|| qS r   r   re   r   r   r   r   #  s     )r   r)   r7   r   r8   ra   r:   ro   addsrp   subs)	r   rq   rr   rs   rt   Z	data_addsr   Z	data_subsr   r   r   r    test_arithmetic_subadd_saturated  s    
z*_SIMD_INT.test_arithmetic_subadd_saturatedc           	      C   s   |   }|  | j}| || | }}dd t||D }| ||}||ksVtdd t||D }| ||}||kstd S )Nc                 S   s   g | ]\}}t ||qS r   )r4   re   r   r   r   r   ,  s     z/_SIMD_INT.test_math_max_min.<locals>.<listcomp>c                 S   s   g | ]\}}t ||qS r   )r3   re   r   r   r   r   0  s     )r)   r   ra   ro   r4   rp   r3   )	r   rq   rr   rs   rt   Zdata_maxZsimd_maxZdata_minZsimd_minr   r   r   test_math_max_min'  s    z_SIMD_INT.test_math_max_minr%   iir   d   i'  c                 C   s@   |  | |}| |t|ks&t| |t|ks<tdS )zf
        Test intrinsics:
            npyv_reduce_max_##sfx
            npyv_reduce_min_##sfx
        N)ra   r)   Z
reduce_maxr4   rp   Z
reduce_minr3   )r   r%   rs   r   r   r   test_reduce_max_min4  s    z_SIMD_INT.test_reduce_max_minN)rF   rY   rZ   r   r   r   r   r   r   r   r   r   r   r   r   r      s   !r   c                   @   s   e Zd ZdZdd ZdS )
_SIMD_FP32z'
    To only test single precision
    c                    sv   |   }| jjs&td|r&dd  nt | |  }| || 	d} fdd|D }| 
|}||ksrtdS )
        Round to nearest even integer, assume CPU control register is set to rounding.
        Test intrinsics:
            npyv_round_s32_##SFX
        z.*(NEON|ASIMD)c                 S   s   t | | dkrdnd S )Nr         ?      r   )r5   r   r   r   r   N  r   z-_SIMD_FP32.test_conversions.<locals>.<lambda>r   c                    s   g | ]} |qS r   r   r   _roundr   r   r   S  s     z/_SIMD_FP32.test_conversions.<locals>.<listcomp>N)rX   r   simd_f64rematchroundra   r)   subr=   	round_s32rp   )r   featuresrs   
data_roundvroundr   r   r   test_conversionsD  s    

z_SIMD_FP32.test_conversionsNrF   rY   rZ   r   r   r   r   r   r   r   @  s   r   c                   @   s   e Zd ZdZdd ZdS )
_SIMD_FP64z'
    To only test double precision
    c                 C   sh   |  |  }| || d}| || d}dd t|t| D }| ||}||ksdtdS )r   r   g      c                 S   s   g | ]}t |qS r   )r   r   r   r   r   r   d  s     z/_SIMD_FP64.test_conversions.<locals>.<listcomp>N)ra   r)   r   r=   mulr#   r   rp   )r   rs   rt   r   r   r   r   r   r   [  s    z_SIMD_FP64.test_conversionsNr   r   r   r   r   r   W  s   r   c                   @   sj  e Zd ZdZdd Zdd Zdd Zdd	 Zej	
d
dejfdejfdejfdefgdd Zej	
dddddddgdd Zdd Zdd Zej	
dddddgdd  Zej	
d!ejd"fejd#fejd$fejd%fejd&fejd'fgd(d) Zej	
dd*d+gej	
d,ed-d.gd.ed-ged-d/gd/ed-ged-ed-gd0d1gd1d0gd2d1gfd3d4 Zd5S )6_SIMD_FPz0
    To test all float vector types at once
    c                 C   s   |  |  gd \}}}| ||}|  dd t|||D }| |||}||ks\t| |||}| ||}||kst| |||}	| ||}
|	|
kst| 	|||}| 
|| d}||kstd S )N   c                 S   s   g | ]\}}}|| | qS r   r   )r   rf   rC   cr   r   r   r   p  s     z2_SIMD_FP.test_arithmetic_fused.<locals>.<listcomp>r;   )ra   r)   addro   Zmuladdrp   Zmulsubr   ZnmuladdZnmulsubr   r=   )r   rs   rt   Zvdata_cZ	vdata_cx2Zdata_fmafmaZfmsZdata_fmsZnfmaZ	data_nfmaZnfmsZ	data_nfmsr   r   r   test_arithmetic_fusedl  s    z_SIMD_FP.test_arithmetic_fusedc                 C   s   |   |  |    }}}|  }| |  }d||f||f||ff}|D ]:\}}|g| j }	| | |}
|
tj	|	ddksNt
qN| | || d}
|
|kst
d S )N)r   r   TZnan_okr;   )rN   rO   rQ   r)   ra   r   absr=   r   approxrp   r   )r   pinfninfrP   r_   r   Z	abs_casescaser   Zdata_absZvabsr   r   r   test_abs  s    z_SIMD_FP.test_absc                 C   s   |   |  |    }}}|  }| |  }ddd|f||f||ff}|D ]:\}}|g| j }	| | |}
|
tj	|	ddksPt
qP| dd |D }	| |}
|
|	kst
d S )N)       r   )        r   g      Tr   c                 S   s   g | ]}t |qS r   )mathsqrtr   r   r   r   r     s     z&_SIMD_FP.test_sqrt.<locals>.<listcomp>)rN   rO   rQ   r)   ra   r   r   r=   r   r   rp   )r   r   r   rP   r_   r   Z
sqrt_casesr   r   Z	data_sqrtr   r   r   r   	test_sqrt  s    
z_SIMD_FP.test_sqrtc                 C   s   |   |  |    }}}|  }| |  }||f||f||ff}|D ]:\}}|g| j }	| | |}
|
tj	|	ddksLt
qLdd |D }	| |}
|
|	kst
d S )NTr   c                 S   s   g | ]}|| qS r   r   r   r   r   r   r     s     z(_SIMD_FP.test_square.<locals>.<listcomp>)rN   rO   rQ   r)   ra   r   squarer=   r   r   rp   )r   r   r   rP   r_   r   Zsquare_casesr   r   Zdata_squarer   r   r   r   test_square  s    
z_SIMD_FP.test_squarezintrin, funcceiltruncfloorZrintc                    sp  |}t | |}|  |  |    }}}||f||f||ff}|D ]8\}}	|	g| j }
|| |}|tj|
ddksDtqDt	dddD ]TdD ]J| 
fddt	| jD } fd	d|D }
||}||
kstqqd
D ]4}| ||} fddD }
||
kstq|dkr*d}nd}|D ]8| || }| | d}
||
ks2tq2dS )z
        Test intrinsics:
            npyv_rint_##SFX
            npyv_ceil_##SFX
            npyv_trunc_##SFX
            npyv_floor##SFX
        Tr   r   i      )gggffffffg?g?gffffff?c                    s   g | ]}|   qS r   r   r   )wr   r   r   r     s     z*_SIMD_FP.test_rounding.<locals>.<listcomp>c                    s   g | ]} |qS r   r   r   r   r   r   r     s     )g/Cg/Cg?Dg_Dc                    s   g | ]} |qS r   r   )r   nr   r   r   r     s     r   )r   )r   g      пg333333ӿgܿr   r   N)r   rN   rO   rQ   r   r=   r   r   rp   r    ra   r<   )r   r   r   intrin_namer   r   rP   Zround_casesr   r   r   r   r_   r   yZ
data_szeror   )r   r   r   r   test_rounding  s4    

 

z_SIMD_FP.test_roundingr   r4   ZmaxpZmaxnr3   ZminpZminnc                    s
  |   |  |    }} ddddd|dd d}t|dd }t| d| }t| |}| jd }d	d
gd
d	gfddgddgf|dgd|gfd|g|dgfddgddgfddgddgff}|D ]b\}	}
| |	| }| |
| }|||}|||}||kst||}||}||kstq|s6dS |dkrJdd }n fdd} dfd f |f| f  ff}|D ]\}	}
| |	|
g| }||	|
}||}|t	j
|ddkst| |	}| |
}|g| j }|||}|t	j
|ddks|tq|dS )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
        r   r   )ZxpnpnnZxnNr   r   Zreduce_r   r   
   ic                 S   s    t | r|S t |r| S |S Nr   isnanrf   rC   r   r   r   r     s    z'_SIMD_FP.test_max_min.<locals>.<lambda>c                    s   t | st |r S |S r   r   r   rP   r   r   r     s    Tr   )rN   rO   rQ   getr   r   r   ra   rp   r   r   r=   )r   r   r   r   Zchk_nanr   Zreduce_intrinZ	hf_nlanesZcasesZop1Zop2rs   rt   r_   r   Ztest_nanZvdata_abr   r   r   test_max_min  sV    









z_SIMD_FP.test_max_minc                 C   s   |   |  |    }}}|  }| |  }||f|df|dfd|fd|ff}|D ]:\}}|g| j }	| | |}
|
tj	|	ddksXt
qX| dd |D }	| |}
|
|	kst
d S )Nr   r   Tr   c                 S   s   g | ]}d | qS )r   r   r   r   r   r   r   /  s     z,_SIMD_FP.test_reciprocal.<locals>.<listcomp>)rN   rO   rQ   r)   ra   r   recipr=   r   r   rp   )r   r   r   rP   r_   r   Zrecip_casesr   r   Z
data_recipr   r   r   r   test_reciprocal$  s    "
z_SIMD_FP.test_reciprocalc                 C   s,   |  | |  }|dg| j ks(tdS )zQ
        Compare Not NaN. Test intrinsics:
            npyv_notnan_##SFX
        r   N)Znotnanr=   rQ   r   rp   )r   Znnanr   r   r   test_special_cases3  s    z_SIMD_FP.test_special_casesr   c                 C   sV   t | |}tdtdtd fD ].}| |}t  || tdddks"tq"d S )NrP   rK   T)r
   F)r   rM   r=   r   r   rp   )r   r   r   dr5   r   r   r   test_unary_invalid_fpexception;  s    

z'_SIMD_FP.test_unary_invalid_fpexceptionzpy_comp,np_compcmpltcmplecmpgtcmpgecmpeqcmpneqc                    s   |   |  |    }}}|    fdd}t| |}d|f|df||f||f||fdf}|D ]f\}	}
|	g| j }|
g| j }| |	}| |
}||||}fddt||D }||ksbtqbd S )Nc                    s    fdd| D S )Nc                    s   g | ]}| kqS r   r   r   Zlane	mask_truer   r   r   S  s     zF_SIMD_FP.test_comparison_with_nan.<locals>.to_bool.<locals>.<listcomp>r   rI   r   r   r   to_boolR  s    z2_SIMD_FP.test_comparison_with_nan.<locals>.to_boolr   )r   r   c                    s   g | ]\}} ||qS r   r   re   )py_compr   r   r   ^  s     z5_SIMD_FP.test_comparison_with_nan.<locals>.<listcomp>)	rN   rO   rQ   r?   r   r   r=   ro   rp   )r   r   Znp_compr   r   rP   r   r   Z	cmp_casesZcase_operand1Zcase_operand2rq   rr   rs   rt   Zvcmpdata_cmpr   )r   r   r   test_comparison_with_nanF  s     	
 

z!_SIMD_FP.test_comparison_with_nanr   r   r_   rP   r   r   r   r   r   c                 C   sB   |  || j }t|}t| |}||}||}||ks>tdS r   ra   r   r   r   rp   r   r   r   r   r   a  s    
z!_SIMD_FP.test_operators_crosstestN)rF   rY   rZ   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   operatorltlegtgeeqner   rM   r   r   r   r   r   r   h  sd     
.     
E   






r   c                   @   sz  e 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
dd Zejdddgdd Zdd Zdd Zdd Zejdejdfejdfejd fejd!fejd"fgd#d$ Zd%d& Zejd'd(d)gejd*d+d,d-d.gd/d0d1d2gd3d+d,d-d.gd4d5d6d7gd3d/d0d1d.gd3gd+gd/gfd8d9 Zd:d; Zd<d= Zd>d? Zd@dA ZdBdC Z dDdE Z!dFdG Z"dHdI Z#dJdK Z$dLS )M	_SIMD_ALLz*
    To test all vector types at once
    c                 C   s   |   }| |}||kst| |}||ks4t| |}||ksJt| |}t|d | jd  }|d | jd  }||kst||kstd S )Nr   )r)   ra   rp   Zloadaloadsloadlr#   r   )r   r_   Z	load_dataZ
loada_dataZ
loads_datar	  Z
loadl_halfZ	data_halfr   r   r   test_memory_load}  s    



z_SIMD_ALL.test_memory_loadc                 C   s  |   }| |}dg| j }| || ||ks6tdg| j }| || ||ksZtdg| j }| || ||ks~tdg| j }| || |d | jd  |d | jd  kst||kstdg| j }| || |d | jd  || jd d  kst||kstd S )Nr   r   )	r)   ra   r   storerp   ZstoreaZstoresZstorelZstoreh)r   r_   r   r  Zstore_aZstore_sZstore_lZstore_hr   r   r   test_memory_store  s&    
(*z_SIMD_ALL.test_memory_storec                 C   s   | j dkrd S |  }ttd| jd }|| jd | jd g7 }|D ]n}| ||d}|d | dg| j|   }||kst| ||}|d | dg| j|   }||ksFtqFd S )Nr   r   u16s16r   r   r      r   )r   r)   r#   r    r   	load_tillrp   
load_tillz)r   r_   lanesr   r  	data_tillr  Z
data_tillzr   r   r   test_memory_partial_load  s    
z"_SIMD_ALL.test_memory_partial_loadc                 C   s   | j dkrd S |  }| jdd}| |}ttd| jd }|| jd | jd g7 }|D ]F}| }|d | |d |< | jdd}| ||| ||ks\tq\d S )Nr  Trd   r   r   r   )	r   r)   ra   r#   r    r   copy
store_tillrp   )r   r_   Zdata_revr   r  r   r  r  r   r   r   test_memory_partial_store  s    

z#_SIMD_ALL.test_memory_partial_storec                 C   s   | j dkrd S tddD ]<}| j|| j d}|d d | }| ||}||kstqtddD ]D}| || | j }| |d d | }| ||}||ks`tq`d S )Nr  r   @   r   r   )r   r    r)   r   loadnrp   ra   )r   strider_   data_strider  r   r   r   test_memory_noncont_load  s    
z"_SIMD_ALL.test_memory_noncont_loadc           
      C   s  | j dkrd S ttd| jd }|| jd | jd g7 }tddD ]}| j|| j d}|d d | }|D ]r}|d | dg| j|   }| |||d}||kst|d | dg| j|   }| |||}	|	|ksltqlqDtd	dD ]}| || | j }t| |d d | }|D ]x}|d | dg| j|   }| |||d}||ks^t|d | dg| j|   }| |||}	|	|ks tq qd S )
Nr  r   r   r   r  r   r  r   r  )	r   r#   r    r   r)   
loadn_tillrp   loadn_tillzra   )
r   r  r  r_   r  r   Zdata_stride_tillr  Zdata_stride_tillzr   r   r   r    test_memory_noncont_partial_load  s0    
z*_SIMD_ALL.test_memory_noncont_partial_loadc                 C   s6  | j dkrd S | |  }tddD ]|}dg| | j }||d d |< dg| | j }|dgd 7 }| ||| |d d |kst|dd  dgd ks&tq&tddD ]}dg|  | j }||d d |< dgd }|dg|  | j 7 }| ||| |dd  |kst|d d dgd kstqd S )Nr  r   r  r     r  r   )r   ra   r)   r    r   storenrp   )r   r   r  r_   r#  r   r   r   test_memory_noncont_store  s&    

z#_SIMD_ALL.test_memory_noncont_storec                 C   s  | j dkrd S |  }| |}ttd| jd }|| jd | jd g7 }tddD ]}|D ]}dg| | j }|d | dg| j|   |d d |< dg| | j }|dgd 7 }| |||| |d d |kst|dd  dgd ks^tq^qVtdd	D ]}|D ]}dg|  | j }|d | dg| j|   |d d |< dgd }|dg|  | j 7 }| |||| |dd  |kst|d d dgd ks
tq
qd S )
Nr  r   r   r   r  r  r"  r  r   )r   r)   ra   r#   r    r   storen_tillrp   )r   r_   r   r  r  r   r  r%  r   r   r   !test_memory_noncont_partial_store  s0    

&&
z+_SIMD_ALL.test_memory_noncont_partial_storezintrin, table_size, elsize)z
self.lut32    r'  )z
self.lut16   r  c           
      C   sj   ||   krdS t|}t| jd| }td|}|D ],}| |}||}|||}	|	|ks8tq8dS )zi
        Test lookup table intrinsics:
            npyv_lut32_##sfx
            npyv_lut16_##sfx
        Nr>   r   )r2   r   r   r   r    r=   rp   )
r   r   Z
table_sizeZelsizeZ	idx_itrintabler   ZbroadiidxZlutr   r   r   test_lut'  s    



z_SIMD_ALL.test_lutc                 C   s  |   }|dg| j ksttddD ]"}| |}||g| j ks&tq&|  | jdd }}| || | }}| j| }||kst| jd| }	|	|kstdddd	d
dddg}
| j	j
r|
d | j	jr|
d |
D ](}t| d| |j}|d| kstq| | |   |   ||}||ks8t| | |   |   ||}||ksdt| ||d ks|t| j	  d S )Nr   r   r   Trd   r   r   r  r  r   r   r   r   f64f32Zreinterpret_rA   )r   )zeror   rp   r    r=   r)   ra   setZsetfr   r   appendsimd_f32r   rF   selectr   r   Zextract0cleanup)r   Zbroadcast_zeror   Z
broadcastirq   rr   rs   rt   ZvsetZvsetfsfxesr   Zvec_nameZselect_aZselect_br   r   r   	test_misc<  s2    



z_SIMD_ALL.test_miscc                 C   s  |   | j dd }}| || | }}|d | jd  }|d | jd  }|| jd d  }|| jd d  }| ||}	|	|| kst| ||}
|
|| kst| ||}||| || fkstdd t||D }dd t||D }| ||}|||fkstd S )NTrd   r   c                 S   s   g | ]}|D ]}|qqS r   r   r   pr5   r   r   r   r   |  s       z*_SIMD_ALL.test_reorder.<locals>.<listcomp>c                 S   s   g | ]}|D ]}|qqS r   r   r6  r   r   r   r   }  s       )r)   ra   r   combinelrp   combinehcombinero   )r   rq   rr   rs   rt   Z	data_a_loZ	data_b_loZ	data_a_hiZ	data_b_hir8  r9  r:  Z	data_ziplZ	data_ziphZvzipr   r   r   test_reorderi  s     z_SIMD_ALL.test_reorderc                    sZ   |     dkrd S  fddtd| jd  D }| | t| j}||ksVtd S )Nr  c                    s,   g | ]$}t t||d    D ]}|qqS )r  )r!   r    )r   r   r   Zssizer   r   r     s    z0_SIMD_ALL.test_reorder_rev64.<locals>.<listcomp>r   )r2   r    r   rev64ra   rp   )r   Z
data_rev64r=  r   r<  r   test_reorder_rev64  s    
z_SIMD_ALL.test_reorder_rev64zfunc, intrinr   r   r   r   r   c           
         s   |   r|  }n| |  | j }| j|  dd}| || | }}t| |}|  fdd} fddt||D }||||}	|	|kst	d S )NTrd   c                    s    fdd| D S )Nc                    s   g | ]}| kqS r   r   r   r   r   r   r     s     zH_SIMD_ALL.test_operators_comparison.<locals>.to_bool.<locals>.<listcomp>r   r   r   r   r   r     s    z4_SIMD_ALL.test_operators_comparison.<locals>.to_boolc                    s   g | ]\}} ||qS r   r   re   r   r   r   r     s     z7_SIMD_ALL.test_operators_comparison.<locals>.<listcomp>)
r"   r)   r7   r   r8   ra   r   r?   ro   rp   )
r   r   r   rq   rr   rs   rt   r   r   cmpr   )r   r   r   test_operators_comparison  s    

z#_SIMD_ALL.test_operators_comparisonc                 C   s  |   r|  }n| |  | j }| j|  dd}| || | }}|   rz| |}| |}| j| j }}n|| }}dd | j }}|dd t||D }	|| ||}
|
|	kst	|dd t||D }|t
| d||}||kst	|d	d t||D }|t
| d
||}||ks<t	|dd |D }|t
| d|}||ksnt	| jdkr~d S dd t||D }|t
| d||}||kst	d S )NTrd   c                 S   s   | S r   r   )rf   r   r   r   r     r   z2_SIMD_ALL.test_operators_logical.<locals>.<lambda>c                 S   s   g | ]\}}||A qS r   r   re   r   r   r   r     s     z4_SIMD_ALL.test_operators_logical.<locals>.<listcomp>c                 S   s   g | ]\}}||B qS r   r   re   r   r   r   r     s     rh   c                 S   s   g | ]\}}||@ qS r   r   re   r   r   r   r     s     rg   c                 S   s   g | ]
}| qS r   r   r   r   r   r   r     s     rj   r   c                 S   s   g | ]\}}|| @ qS r   r   re   r   r   r   r     s     rn   )r"   r)   r7   r   r8   ra   r<   ro   ri   rp   r   r   )r   rq   rr   rs   rt   Zdata_cast_aZdata_cast_bcastZ	cast_datary   rz   rw   rx   ru   rv   Zdata_notr{   r|   r}   r   r   r   r~     s8    



z _SIMD_ALL.test_operators_logicalr   r   r   r_   r   r   r   r   r;   r   r   r"  i  il    c                 C   sB   |  || j }t|}t| |}||}||}||ks>tdS r   r   r   r   r   r   r     s    
z"_SIMD_ALL.test_operators_crosstestc                 C   s   d| j dd   }t| jd|| j f }t| jd| j |f }|| d}| | d| d}||kspt||}||}||kstd S )NrC   r   z	cvt_%s_%sr   )r   r   r   r=   r   rp   )r   ZbsfxZ
to_booleanZfrom_booleanZfalse_vbZtrue_vbZ
false_vsfxZ	true_vsfxr   r   r   test_conversion_boolean  s    z!_SIMD_ALL.test_conversion_booleanc                 C   s   | j dkrdS | j d tt| j dd d  }t| jd| d| j  }| |  | j }| |}||}|d| jd  }|| jd d }|||fkst	dS )zh
        Test expand intrinsics:
            npyv_expand_u16_u8
            npyv_expand_u32_u16
        r   r  Nr   r   r   Zexpand_r   )
r   strr1   r   r   r)   r7   r   ra   rp   )r   Ztotypeexpandr_   r   ZedataZdata_loZdata_hir   r   r   test_conversion_expand  s    
$
z _SIMD_ALL.test_conversion_expandc           	      C   s   |   r|  }n| |  | j }| j|  dd}| || | }}| dd t||D }| ||}||kst| dd t||D }| 	||}||kstd S )NTrd   c                 S   s   g | ]\}}|| qS r   r   re   r   r   r   r     s     z4_SIMD_ALL.test_arithmetic_subadd.<locals>.<listcomp>c                 S   s   g | ]\}}|| qS r   r   re   r   r   r   r     s     )
r"   r)   r7   r   r8   ra   ro   r   rp   r   )	r   rq   rr   rs   rt   data_addr   data_subr   r   r   r   test_arithmetic_subadd  s    
z _SIMD_ALL.test_arithmetic_subaddc                 C   s   | j dkrd S |  r |  }n| |  | j }| j|  dd}| || | }}| dd t||D }| ||}||kst	d S )N)r   r   Trd   c                 S   s   g | ]\}}|| qS r   r   re   r   r   r   r     s     z1_SIMD_ALL.test_arithmetic_mul.<locals>.<listcomp>)
r   r"   r)   r7   r   r8   ra   ro   r   rp   )r   rq   rr   rs   rt   Zdata_mulr   r   r   r   test_arithmetic_mul  s    

z_SIMD_ALL.test_arithmetic_mulc                 C   sn   |   sd S |  | jdd }}| || | }}| dd t||D }| ||}||ksjtd S )NTrd   c                 S   s   g | ]\}}|| qS r   r   re   r   r   r   r   +  s     z1_SIMD_ALL.test_arithmetic_div.<locals>.<listcomp>)r"   r)   ra   ro   divrp   )r   rq   rr   rs   rt   Zdata_divrM  r   r   r   test_arithmetic_div#  s    z_SIMD_ALL.test_arithmetic_divc                    sV  |   rdS |  fddd g}|tddd7 }|tddd7 }|  }|d	krz|tdd
d7 }|tdd
d7 }|dkr|td
dd7 }|td
dd7 }|dkr|tddd7 }|tddd7 }|dd |D 7 }t||D ]h\} |  d   dkr
q| | |} fdd|D }| 	 }| 
||}||kstqdS )zn
        Test integer division intrinsics:
            npyv_divisor_##sfx
            npyv_divc_##sfx
        Nc                    sR   |dkr|  kr| S | dk |dk  }}| dks6||kr>| | S | | | | d S )z
            Divide towards zero works with large integers > 2^53,
            and wrap around overflow similar to what C does.
            r;   r   r   r   )rf   r   Zsign_aZsign_d)int_minr   r   	trunc_div9  s    z3_SIMD_ALL.test_arithmetic_intdiv.<locals>.trunc_divr   r      r'     r	   r   i    i  r(  l        i    il            l            l    c                 S   s   g | ]
}| qS r   r   r   r   r   r   r   S  s     z4_SIMD_ALL.test_arithmetic_intdiv.<locals>.<listcomp>c                    s   g | ]}| qS r   r   r   )divisorrP  r   r   r   Y  s     )r"   r8   r    r2   	itertoolsproductr=   ra   r)   rS  divcrp   )r   r_   ZbsizeZdividendZ	data_divcZdivisor_parmsrV  r   )rS  rO  rP  r   test_arithmetic_intdiv/  s6    


z _SIMD_ALL.test_arithmetic_intdivc                 C   sB   | j dkrdS |  }| |}t|}| |}||ks>tdS )zH
        Test reduce sum intrinsics:
            npyv_sum_##sfx
        )r   r   r-  r,  N)r   r)   ra   r   rp   )r   r_   r   data_sumvsumr   r   r   test_arithmetic_reduce_sum^  s    


z$_SIMD_ALL.test_arithmetic_reduce_sumc                 C   sj   | j dkrdS d| j|  |  | j f}|D ]6}| |}| |}t|}| |}||ks.tq.dS )zQ
        Test extend reduce sum intrinsics:
            npyv_sumup_##sfx
        rE  Nr   )	r   r   r8   r7   r)   ra   r   Zsumuprp   )r   r   rr_   r   rX  rY  r   r   r   test_arithmetic_reduce_sumupm  s    



z&_SIMD_ALL.test_arithmetic_reduce_sumupc           	      C   s   |  |  }|  | jdd}| |  |  }| |  |  }| ||}| ||||}||kspt| ||||}||kst| ||}| 	||||}||kst| 	||||}||kstdS )z
        Conditional addition and subtraction for all supported data types.
        Test intrinsics:
            npyv_ifadd_##SFX, npyv_ifsub_##SFX
        Trd   N)
ra   r)   r   r.  r   r   ifsubrp   r   ifadd)	r   rs   rt   r^   Z
false_maskrJ  r]  rI  r^  r   r   r   test_mask_conditional|  s    z_SIMD_ALL.test_mask_conditionalN)%rF   rY   rZ   r   r
  r  r  r  r  r!  r$  r&  r   r   r   r+  r5  r;  r>  r   r  r  r  r  r  r@  r~   r   rD  rH  rK  rL  rN  rW  rZ  r\  r_  r   r   r   r   r  y  s^   
-
&



/r  )rk   r   r   r   )r   r   r  r  r   r   r   r   )r-  r,  )r-  )r,  rB   rR   r   (rS   )ztarget 'z$' isn't supported by current machinez' isn't supported by NPYVz"' doesn't support single-precisionr-  z!' doesn'tsupport double-precisionr,  )r   r   rT   ZTestr   )reason)FFFFF)2r   r   r   rT  r   Znumpy.core._simdr   r   r   Znumpy.core._multiarray_umathr   r   r   r[   r   r   r   r   r  Zbool_sfxZint_sfxZfp_sfxZall_sfxZtests_registryitemsrT   r   r   Z
simd_widthrU   pretty_namelenrV   skipdictZskip_sfxr1  r   r4  clsr   r   Zskip_mZinhrr   typerF   tclsr   globalsr   r   r   r   <module>   s        
`{N            
&