o
    0cf                     @   s  d dl Z d dlZd dlZd dlZd dlmZ d dlm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rxejndZedZeedkrdde dZned  ZdZe Zesde dZnejsde dZnej sde d ed!< e D ]?\Z!Z"e!D ]8Z#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%re j+je%d%e* e*e, e*j)< qqqodS )&    N)targets)__cpu_baseline__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attr r   P/var/www/html/gps/gps/lib/python3.10/site-packages/numpy/core/tests/test_simd.py__getattr__   s   z_Test_Utility.__getattr__Fc                 C   sR   |du rd}|du r| j }t||| }|rt|}|  r%dd |D S t|S )z[
        Create list of consecutive numbers according to number of vector's lanes.
        N   c                 S   s   g | ]}|d  qS )g      ?r   .0xr   r   r   
<listcomp>#       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      | j d dkS )Nr   ur	   r
   r   r   r   _is_unsigned&      z_Test_Utility._is_unsignedc                 C   r   )Nr   sr!   r"   r   r   r   
_is_signed)   r$   z_Test_Utility._is_signedc                 C   r   )Nr   fr!   r"   r   r   r   r   ,   r$   z_Test_Utility._is_fpc                 C   s   t | jdd  S )Nr   )intr	   r"   r   r   r   _scalar_size/      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max_intmin_intr   r   r   7       z+_Test_Utility._int_clip.<locals>.<listcomp>)r   _int_max_int_min)r
   seqr   r.   r   	_int_clip2   s
   z_Test_Utility._int_clipc                 C   s4   |   rd S | | dd }|  r|d S |S )Nr      )r   _to_unsignedsetallr&   )r
   max_ur   r   r   r2   9   s   z_Test_Utility._int_maxc                 C   s&   |   rd S |  rdS |  d  S )Nr   r   )r   r#   r2   r"   r   r   r   r3   A   s
   z_Test_Utility._int_minc                 C   s&   t | jd| jdd   d}|d S )Nsetall_ur   r6   r   r   )r
   	max_unsigr   r   r   
_true_maskH   s   z_Test_Utility._true_maskc                 C   sp   t |ttfrt| jd| jdd   |S |jdd}|d dkr&d}nd}t| j||d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	   
cvt_intrinr   r   r   r8   L   s    z_Test_Utility._to_unsignedc                 C      | j d}| j |d S )Ni  r   r   
setall_u32reinterpret_f32_u32r
   r-   r   r   r   
_pinfinityW      z_Test_Utility._pinfinityc                 C   rI   )Nl       r   rJ   rM   r   r   r   
_ninfinity[   rO   z_Test_Utility._ninfinityc                 C   rI   )Ni  r   rJ   rM   r   r   r   _nan_   rO   z_Test_Utility._nanc                 C   s(   | j }|dkr
t}n|d}d|S )Nbaseline__ )target_namer   splitjoin)r
   targetr   r   r   _cpu_featuresc   s
   

z_Test_Utility._cpu_featuresNNF)rD   
__module____qualname__r   r	   rU   r   r   r#   r&   r   r)   r5   r2   r3   r=   r8   rN   rP   rQ   rY   r   r   r   r   r      s&    
r   c                   @   s2   e Zd ZdZdddZdd Zdd	 Zd
d ZdS )
_SIMD_BOOLz2
    To test all boolean vector types at once
    NFc                    sH   t | jd| jdd   }|   t|}|rt|} fdd|D S )Nnlanes_ur   c                    s   g | ]
}|d  r
 ndqS )r7   r   r   r   	true_maskr   r   r   u   r1   z$_SIMD_BOOL._data.<locals>.<listcomp>)r   r   r	   r=   r   r   )r
   r   r   r   r   r   r   r_   r   r   o   s   z_SIMD_BOOL._datac                 C   sB   | j dd  }t| jd| }t| jd| d| }|||S )Nr   r>   cvt_b_u)r	   r   r   )r
   datalen_strloadcvtr   r   r   _load_bw   s   z_SIMD_BOOL._load_bc                 C   s   |   }| j dd}| |}| |}dd t||D }t| d||}||ks,J dd t||D }t| d||}||ksDJ dd t||D }	t| d	||}
|
|	ks\J t| d
|}||ksiJ dS )z
        Logical operations for boolean types.
        Test intrinsics:
            npyv_xor_##SFX, npyv_and_##SFX, npyv_or_##SFX, npyv_not_##SFX
        Tr   c                 S      g | ]\}}||@ qS r   r   r   arA   r   r   r   r          z5_SIMD_BOOL.test_operators_logical.<locals>.<listcomp>andc                 S      g | ]\}}||B qS r   r   rj   r   r   r   r      rl   orc                 S      g | ]\}}||A qS r   r   rj   r   r   r   r      rl   xornotN)r   rg   zipr   )r
   data_adata_bvdata_avdata_bdata_andvanddata_orvordata_xorvxorvnotr   r   r   test_operators_logical}   s   

z!_SIMD_BOOL.test_operators_logicalc                 C   sV   dd }|   | j ddfD ]}| |}||}t| |}|t|ks(J qd S )Nc                 S   s   t dd t| dD S )Nc                 S   s    g | ]\}}t |d k|> qS )r   r(   )r   ir   r   r   r   r      s     z<_SIMD_BOOL.test_tobits.<locals>.<lambda>.<locals>.<listcomp>r   )sum	enumerate)rc   r   r   r   <lambda>   rl   z(_SIMD_BOOL.test_tobits.<locals>.<lambda>Trh   )r   rg   bintobits)r
   	data2bitsrc   vdata	data_bitsr   r   r   r   test_tobits   s   
z_SIMD_BOOL.test_tobitsrZ   )rD   r[   r\   __doc__r   rg   r   r   r   r   r   r   r]   k   s    
r]   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )		_SIMD_INTz2
    To test all integer vector types at once
    c                    s4  | j dv rd S | |  | j }| j|  dd}| || |}}t|  D ]2 |  fdd|D }| | }||ksEJ |  fdd|D }| 	| }||ks]J q+td|  D ]2 |  fdd|D }| 
| }	|	|ksJ |  fd	d|D }| | }
|
|ksJ qed S )
N)u8s8Trh   c                       g | ]}| > qS r   r   r   rk   r   r   r   r      r   z2_SIMD_INT.test_operators_shift.<locals>.<listcomp>c                       g | ]}| ? qS r   r   r   r   r   r   r      r   r   c                    r   r   r   r   r   r   r   r      r   c                    r   r   r   r   r   r   r   r      r   )r	   r   r2   r   r3   re   r   r)   shlshrshlishri)r
   rt   ru   rv   rw   
data_shl_ar   
data_shr_ar   r   r   r   r   r   test_operators_shift   s(   
z_SIMD_INT.test_operators_shiftc           	      C   s   | j dv rd S | |  | j }| j|  dd}| || |}}| dd t||D }| ||}||ks>J | dd t||D }| 	||}||ksWJ d S )N)u32s32u64s64Trh   c                 S      g | ]\}}|| qS r   r   rj   r   r   r   r      rl   z>_SIMD_INT.test_arithmetic_subadd_saturated.<locals>.<listcomp>c                 S      g | ]\}}|| qS r   r   rj   r   r   r   r      rl   )
r	   r   r2   r   r3   re   r5   rs   addssubs)	r
   rt   ru   rv   rw   	data_addsr   	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s+J dd t||D }| ||}||ksAJ d S )Nc                 S      g | ]	\}}t ||qS r   r,   rj   r   r   r   r          z/_SIMD_INT.test_math_max_min.<locals>.<listcomp>c                 S   r   r   r+   rj   r   r   r   r      r   )r   r   re   rs   r,   r+   )	r
   rt   ru   rv   rw   data_maxsimd_maxdata_minsimd_minr   r   r   test_math_max_min   s   z_SIMD_INT.test_math_max_minN)rD   r[   r\   r   r   r   r   r   r   r   r   r      s
    !r   c                   @      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s9J 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 S d S )Nr         ?      r   )r-   r   r   r   r      r1   z-_SIMD_FP32.test_conversions.<locals>.<lambda>r   c                       g | ]} |qS r   r   r   _roundr   r   r      r   z/_SIMD_FP32.test_conversions.<locals>.<listcomp>N)rY   r   simd_f64rematchroundre   r   subr9   	round_s32)r
   featuresrv   
data_roundvroundr   r   r   test_conversions   s   

z_SIMD_FP32.test_conversionsNrD   r[   r\   r   r   r   r   r   r   r          r   c                   @   r   )
_SIMD_FP64z'
    To only test double precision
    c                 C   sh   |  |  }| || d}| || d}dd t|t| D }| ||}||ks2J dS )r   r   g      c                 S   s   g | ]}t |qS r   )r   r   r   r   r   r     r   z/_SIMD_FP64.test_conversions.<locals>.<listcomp>N)re   r   r   r9   mulr   r   )r
   rv   rw   r   r   r   r   r   r      s   z_SIMD_FP64.test_conversionsNr   r   r   r   r   r      r   r   c                   @   s   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dd Zdd Zdd Zdd ZdS )_SIMD_FPz0
    To test all float vector types at once
    c                 C   s   |  |  gd \}}}| ||}|  dd t|||D }| |||}||ks.J | |||}| ||}||ksAJ | |||}	| ||}
|	|
ksTJ | |||}| 	|| 
d}||ksjJ d S )N   c                 S   s   g | ]\}}}|| | qS r   r   )r   rk   rA   cr   r   r   r     s    z2_SIMD_FP.test_arithmetic_fused.<locals>.<listcomp>r6   )re   r   addrs   muladdmulsubr   nmuladdnmulsubr   r9   )r
   rv   rw   vdata_c	vdata_cx2data_fmafmafmsdata_fmsnfma	data_nfmanfms	data_nfmsr   r   r   test_arithmetic_fused  s   z_SIMD_FP.test_arithmetic_fusedc                 C   s   |   |  |  }}}|  }| |  }d||f||f||ff}|D ]\}}|g| j }	| | |}
|
tj	|	ddksDJ q'| | 
|| d}
|
|ksWJ d S )N)r   r   Tnan_okr6   )rN   rP   rQ   r   re   r   absr9   pytestapproxr   )r
   pinfninfnanrc   r   	abs_casescasedesireddata_abs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sEJ q(| dd |D }	| |}
|
|	ks[J d S )N)       r   )        r   g      Tr   c                 S   s   g | ]}t |qS r   )mathsqrtr   r   r   r   r   :      z&_SIMD_FP.test_sqrt.<locals>.<listcomp>)
rN   rP   rQ   r   re   r   r   r9   r   r   )r
   r   r   r   rc   r   
sqrt_casesr   r   	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sCJ q&dd |D }	| |}
|
|	ksVJ d S )NTr   c                 S   s   g | ]}|| qS r   r   r   r   r   r   r   I  r   z(_SIMD_FP.test_square.<locals>.<listcomp>)
rN   rP   rQ   r   re   r   squarer9   r   r   )r
   r   r   r   rc   r   square_casesr   r   data_squarer   r   r   r   test_square>  s   
z_SIMD_FP.test_squarezintrin, funcceiltruncfloorrintc                    s0  |}t | |}|  |  |  }}}||f||f||ff}|D ]\}}	|	g| j }
|| |}|tj|
ddks>J q"tdddD ]*dD ]%| 	fddt| jD } fd	d|D }
||}||
ksnJ qIqE|d
krwd}nd}|D ]| 
|| }| 
| d}
||
ksJ q{d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   c  rl   z*_SIMD_FP.test_rounding.<locals>.<listcomp>c                    r   r   r   r   )funcr   r   r   d  r   r   )r   )r   g      пg333333ӿgܿr   r   N)r   rN   rP   rQ   r   r9   r   r   r   re   r8   )r
   intrinr   intrin_namer   r   r   round_casesr   r   r   r   rc   
data_szeror   )r   r   r   r   test_roundingM  s.   

 z_SIMD_FP.test_roundingc                 C   sX  |   }|  | j}| || |}}dd t||D }| ||}||ks+J | ||}||ks7J |  |  |  }}	}
|
|
|
f|
ddfd|
df|||f|d|fd||f|	|	|	f|	ddfd|	dfddf}|D ]:\}}}|g| j }| 	|}| 	|}| ||}|t
j|ddksJ |
|||fv rqo| ||}||ksJ qodS )	zY
        Test intrinsics:
            npyv_max_##SFX
            npyv_maxp_##SFX
        c                 S   r   r   r   rj   r   r   r   r   |  r   z%_SIMD_FP.test_max.<locals>.<listcomp>
   )r   r   r   )r   r   Tr   N)r   r   re   rs   r,   maxprN   rP   rQ   r9   r   r   )r
   rt   ru   rv   rw   r   _maxr   r   r   r   	max_casescase_operand1case_operand2r   r   r   r   test_maxs  2   

z_SIMD_FP.test_maxc                 C   sX  |   }|  | j}| || |}}dd t||D }| ||}||ks+J | ||}||ks7J |  |  |  }}	}
|
|
|
f|
ddfd|
df|||f|ddfd|df|	|	|	f|	d|	fd|	|	fddf}|D ]:\}}}|g| j }| 	|}| 	|}| ||}|t
j|ddksJ |
|||fv rqo| ||}||ksJ qodS )	zY
        Test intrinsics:
            npyv_min_##SFX
            npyv_minp_##SFX
        c                 S   r   r   r   rj   r   r   r   r     r   z%_SIMD_FP.test_min.<locals>.<listcomp>r   )r   r   r   )r   r   r   Tr   N)r   r   re   rs   r+   minprN   rP   rQ   r9   r   r   )r
   rt   ru   rv   rw   r   _minr  r   r   r   	min_casesr  r  r   r   r   r   test_min  r  z_SIMD_FP.test_minc                 C   s   |   |  |  }}}|  }| |  }||f|df|dfd|fd|ff}|D ]\}}|g| j }	| | |}
|
tj	|	ddksIJ q,| dd |D }	| |}
|
|	ks_J d S )Nr   r   Tr   c                 S   s   g | ]}d | qS )r   r   r   r   r   r   r     r   z,_SIMD_FP.test_reciprocal.<locals>.<listcomp>)
rN   rP   rQ   r   re   r   recipr9   r   r   )r
   r   r   r   rc   r   recip_casesr   r   
data_recipr
  r   r   r   test_reciprocal  s   "
z_SIMD_FP.test_reciprocalc                 C   s,   |  | |  }|dg| j ksJ dS )zQ
        Compare Not NaN. Test intrinsics:
            npyv_notnan_##SFX
        r   N)notnanr9   rQ   r   )r
   nnanr   r   r   test_special_cases  s   z_SIMD_FP.test_special_casesN)rD   r[   r\   r   r   r   r   r   r   markparametrizer   r   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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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d3S )4	_SIMD_ALLz*
    To test all vector types at once
    c                 C   s   |   }| |}||ksJ | |}||ksJ | |}||ks%J | |}t|d | jd  }|d | jd  }||ksDJ ||ksJJ d S )Nr7   )r   re   loadaloadsloadlr   r   )r
   rc   	load_data
loada_data
loads_datar  
loadl_half	data_halfr   r   r   test_memory_load  s   



z_SIMD_ALL.test_memory_loadc                 C   s  |   }| |}dg| j }| || ||ksJ dg| j }| || ||ks-J dg| j }| || ||ks?J dg| j }| || |d | jd  |d | jd  ks_J ||kseJ dg| j }| || |d | jd  || jd d  ksJ ||ksJ d S )Nr   r7   )r   re   r   storestoreastoresstorelstoreh)r
   rc   r   r  store_astore_sstore_lstore_hr   r   r   test_memory_store  s&   
((z_SIMD_ALL.test_memory_storec                 C   s   | j dv rd S |  }ttd| jd }|| jd | jd g7 }|D ]7}| ||d}|d | dg| j|   }||ks@J | ||}|d | dg| j|   }||ksZJ q#d S )Nr   r   u16s16r   r7         r   )r	   r   r   r   r   	load_till
load_tillz)r
   rc   lanesnr,  	data_tillr-  
data_tillzr   r   r   test_memory_partial_load  s   
z"_SIMD_ALL.test_memory_partial_loadc                 C   s   | j dv rd S |  }| jdd}| |}ttd| jd }|| jd | jd g7 }|D ]#}| }|d | |d |< | jdd}| ||| ||ksQJ q.d S )Nr'  Trh   r   r7   r*  )r	   r   re   r   r   r   copy
store_till)r
   rc   data_revr   r.  r/  r0  r4  r   r   r   test_memory_partial_store  s   

z#_SIMD_ALL.test_memory_partial_storec                 C   s   | j dv rd S tddD ]}| j|| j d}|d d | }| ||}||ks*J qtddD ]"}| || | j }| |d d | }| ||}||ksRJ q0d S )Nr'  r   @   r   r   )r	   r   r   r   loadnre   )r
   striderc   data_strider9  r   r   r   test_memory_noncont_load  s   
z"_SIMD_ALL.test_memory_noncont_loadc           
      C   s  | j dv rd S ttd| jd }|| jd | jd g7 }tddD ]N}| j|| j d}|d d | }|D ]9}|d | dg| j|   }| |||d}||ksTJ |d | dg| j|   }| |||}	|	|ksoJ q6q"td	dD ]T}| || | j }t| |d d | }|D ]9}|d | dg| j|   }| |||d}||ksJ |d | dg| j|   }| |||}	|	|ksJ qqvd S )
Nr'  r   r7   r*  r7  r   r+  r   r8  )r	   r   r   r   r   
loadn_tillloadn_tillzre   )
r
   r.  r:  rc   r;  r/  data_stride_tillr=  data_stride_tillzr>  r   r   r    test_memory_noncont_partial_load'  s6   
z*_SIMD_ALL.test_memory_noncont_partial_loadc                 C   s4  | j dv rd S | |  }tddD ]>}dg| | j }||d d |< dg| | j }|dgd 7 }| ||| |d d |ksDJ |dd  dgd ksQJ qtddD ]@}dg|  | j }||d d |< dgd }|dg|  | j 7 }| ||| |dd  |ksJ |d d dgd ksJ qWd S )Nr'  r   r7  r+     r8  r   )r	   re   r   r   r   storen)r
   r   r:  rc   rC  r   r   r   test_memory_noncont_storeC  s(   

z#_SIMD_ALL.test_memory_noncont_storec                 C   s  | j dv rd S |  }| |}ttd| jd }|| jd | jd g7 }tddD ]P}|D ]K}dg| | j }|d | dg| j|   |d d |< dg| | j }|dgd 7 }| |||| |d d |ksmJ |dd  dgd kszJ q/q+tdd	D ]R}|D ]M}dg|  | j }|d | dg| j|   |d d |< dgd }|dg|  | j 7 }| |||| |dd  |ksJ |d d dgd ksJ qqd S )
Nr'  r   r7   r*  r7  r+  rB  r8  r   )r	   r   re   r   r   r   storen_till)r
   rc   r   r.  r:  r/  r0  rE  r   r   r   !test_memory_noncont_partial_storeZ  s6   

&	&
z+_SIMD_ALL.test_memory_noncont_partial_storezintrin, table_size, elsize)z
self.lut32    rG  )z
self.lut16   r7  c           
      C   sj   ||   krdS t|}t| jd| }td|}|D ]}| |}||}|||}	|	|ks2J qdS )zi
        Test lookup table intrinsics:
            npyv_lut32_##sfx
            npyv_lut16_##sfx
        Nr;   r   )r)   evalr   r   r   r9   )
r
   r   
table_sizeelsize	idx_itrintabler   broadiidxlutr   r   r   test_lutv  s   



z_SIMD_ALL.test_lutc                 C   sT  |   }|dg| j ksJ tddD ]}| |}||g| j ks$J q|  | jdd}}| || |}}| j| }||ksFJ | jdg|R  }	|	|ksUJ g d}
| jj	rb|

d |
D ]}t| d| |j}|d	| ksxJ qd| | |   |   ||}||ksJ | | |   |   ||}||ksJ | j  d S )
Nr   r   r   Trh   )	r   r   r(  r)  r   r   r   r   f32f64reinterpret_r?   )zeror   r   r9   r   re   setsetfr   r   appendr   rD   selectcmpeqcmpneqcleanup)r
   broadcast_zeror   
broadcastirt   ru   rv   rw   vsetvsetfsfxesr	   vec_nameselect_aselect_br   r   r   	test_misc  s,   


z_SIMD_ALL.test_miscc                 C   s  |   | j dd}}| || |}}|d | jd  }|d | jd  }|| jd d  }|| jd d  }| ||}	|	|| ksHJ | ||}
|
|| ksVJ | ||}||| || fkshJ dd t||D }dd t||D }| ||}|||fksJ d S )NTrh   r7   c                 S      g | ]	}|D ]}|qqS r   r   r   pr-   r   r   r   r     r   z*_SIMD_ALL.test_reorder.<locals>.<listcomp>c                 S   rf  r   r   rg  r   r   r   r     r   )r   re   r   combinelcombinehcombiners   )r
   rt   ru   rv   rw   	data_a_lo	data_b_lo	data_a_hi	data_b_hiri  rj  rk  	data_zipl	data_ziphvzipr   r   r   test_reorder  s    z_SIMD_ALL.test_reorderc                    sZ   |     dkr
d S  fddtd| jd  D }| | t| j}||ks+J d S )Nr7  c                    s,   g | ]}t t||d    D ]}|qqS )r7  )r   r   )r   r   yssizer   r   r     s    z0_SIMD_ALL.test_reorder_rev64.<locals>.<listcomp>r   )r)   r   r   rev64re   )r
   
data_rev64rw  r   ru  r   test_reorder_rev64  s   
z_SIMD_ALL.test_reorder_rev64c                    s  |   r	|  }n
| |  | j }| j|  dd}| || |}}|    fdd}dd t||D }|| ||}||ksIJ dd t||D }|| 	||}	|	|ksaJ dd t||D }
|| 
||}||
ksyJ d	d t||D }|| ||}||ksJ d
d t||D }|| ||}||ksJ dd t||D }|| ||}||ksJ d S )NTrh   c                    s    fdd| D S )Nc                    s   g | ]}| kqS r   r   )r   lane	mask_truer   r   r     r   zH_SIMD_ALL.test_operators_comparison.<locals>.to_bool.<locals>.<listcomp>r   )rG   r{  r   r   to_bool  r*   z4_SIMD_ALL.test_operators_comparison.<locals>.to_boolc                 S   s   g | ]\}}||kqS r   r   rj   r   r   r   r     rl   z7_SIMD_ALL.test_operators_comparison.<locals>.<listcomp>c                 S   s   g | ]\}}||kqS r   r   rj   r   r   r   r     rl   c                 S   s   g | ]\}}||kqS r   r   rj   r   r   r   r     rl   c                 S   s   g | ]\}}||kqS r   r   rj   r   r   r   r     rl   c                 S   s   g | ]\}}||k qS r   r   rj   r   r   r   r     rl   c                 S   s   g | ]\}}||kqS r   r   rj   r   r   r   r     rl   )r   r   r2   r   r3   re   r=   rs   rZ  r[  cmpgtcmpgecmpltcmple)r
   rt   ru   rv   rw   r}  data_eqrZ  data_neqr[  data_gtr~  data_ger  data_ltr  data_ler  r   r{  r   test_operators_comparison  s2   
z#_SIMD_ALL.test_operators_comparisonc                 C   sl  |   r	|  }n
| |  | j }| j|  dd}| || |}}|   r=| |}| |}| j| j}}n||}}dd | j}}|dd t||D }	|| ||}
|
|	ksdJ |dd t||D }|t	| d||}||ksJ |d	d t||D }|t	| d
||}||ksJ |dd |D }|t	| d|}||ksJ d S )NTrh   c                 S   s   | S )Nr   )rk   r   r   r   r   	  s    z2_SIMD_ALL.test_operators_logical.<locals>.<lambda>c                 S   rp   r   r   rj   r   r   r   r     rl   z4_SIMD_ALL.test_operators_logical.<locals>.<listcomp>c                 S   rn   r   r   rj   r   r   r   r     rl   ro   c                 S   ri   r   r   rj   r   r   r   r     rl   rm   c                 S   s   g | ]}| qS r   r   r   r   r   r   r         rr   )
r   r   r2   r   r3   re   r8   rs   rq   r   )r
   rt   ru   rv   rw   data_cast_adata_cast_bcast	cast_datar|   r}   rz   r{   rx   ry   data_notr~   r   r   r   r     s.   



z _SIMD_ALL.test_operators_logicalc                 C   s   d| j dd   }t| jd|| j f }t| jd| j |f }|| d}| | d| d}||ks8J ||}||}||ksFJ d S )NrA   r   z	cvt_%s_%sr   )r	   r   r   r9   rZ  )r
   bsfx
to_booleanfrom_booleanfalse_vbtrue_vb
false_vsfx	true_vsfxr   r   r   test_conversion_boolean  s   z!_SIMD_ALL.test_conversion_booleanc                 C   s   | j dv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sSJ dS )zh
        Test expand intrinsics:
            npyv_expand_u16_u8
            npyv_expand_u32_u16
        r   r(  Nr   r   r7   expand_r   )	r	   strr(   r   r   r   r2   r   re   )r
   totypeexpandrc   r   edatadata_lo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s@J | dd t||D }| ||}||ksYJ d S )NTrh   c                 S   r   r   r   rj   r   r   r   r   E  rl   z4_SIMD_ALL.test_arithmetic_subadd.<locals>.<listcomp>c                 S   r   r   r   rj   r   r   r   r   H  rl   )	r   r   r2   r   r3   re   rs   r   r   )	r
   rt   ru   rv   rw   data_addr   data_subr   r   r   r   test_arithmetic_subadd<  s   
z _SIMD_ALL.test_arithmetic_subaddc                 C   s   | j dv rd S |  r|  }n
| |  | j }| j|  dd}| || |}}| dd t||D }| ||}||ksGJ d S )N)r   r   Trh   c                 S   s   g | ]\}}|| qS r   r   rj   r   r   r   r   W  rl   z1_SIMD_ALL.test_arithmetic_mul.<locals>.<listcomp>)	r	   r   r   r2   r   r3   re   rs   r   )r
   rt   ru   rv   rw   data_mulr   r   r   r   test_arithmetic_mulL  s   

z_SIMD_ALL.test_arithmetic_mulc                 C   sn   |   sd S |  | jdd}}| || |}}| dd t||D }| ||}||ks5J d S )NTrh   c                 S   s   g | ]\}}|| qS r   r   rj   r   r   r   r   c  rl   z1_SIMD_ALL.test_arithmetic_div.<locals>.<listcomp>)r   r   re   rs   div)r
   rt   ru   rv   rw   data_divr  r   r   r   test_arithmetic_div[  s   z_SIMD_ALL.test_arithmetic_divc                    sT  |   rdS |  fddd g}|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rQ|td
dd7 }|td
dd7 }|dkre|tddd7 }|tddd7 }|dd |D 7 }t||D ]3\} |  d   dkrqt| | |} fdd|D }| 	 }| 
||}||ksJ qtd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s||kr| | S | | | | d S )z
            Divide towards zero works with large integers > 2^53,
            and wrap around overflow similar to what C does.
            r6   r   r   r   )rk   dsign_asign_d)int_minr   r   	trunc_divq  s   z3_SIMD_ALL.test_arithmetic_intdiv.<locals>.trunc_divr   r      rG        r   i    i  rH  l        i    il            l            l    c                 S   s   g | ]}| qS r   r   r   r   r   r   r     r  z4_SIMD_ALL.test_arithmetic_intdiv.<locals>.<listcomp>c                    s   g | ]}| qS r   r   r   )divisorr  r   r   r     r   )r   r3   r   r)   	itertoolsproductr9   re   r   r  divc)r
   rc   bsizedividend	data_divcdivisor_parmsr  r   )r  r  r  r   test_arithmetic_intdivg  s8   

z _SIMD_ALL.test_arithmetic_intdivc                 C   sB   | j dvrdS |  }| |}t|}| |}||ksJ dS )zH
        Test reduce sum intrinsics:
            npyv_sum_##sfx
        )r   r   rR  rS  N)r	   r   re   r   )r
   rc   r   data_sumvsumr   r   r   test_arithmetic_reduce_sum  s   


z$_SIMD_ALL.test_arithmetic_reduce_sumc                 C   sj   | j dvrdS d| j|  |  | j f}|D ]}| |}| |}t|}| |}||ks2J qdS )zQ
        Test extend reduce sum intrinsics:
            npyv_sumup_##sfx
        r  Nr   )r	   r   r3   r2   r   re   r   sumup)r
   rdatarrc   r   r  r  r   r   r   test_arithmetic_reduce_sumup  s   



z&_SIMD_ALL.test_arithmetic_reduce_sumupc           	      C   s   |  |  }|  | jdd}| |  |  }| |  |  }| ||}| ||||}||ks8J | ||||}||ksFJ | ||}| ||||}||ksZJ | ||||}||kshJ dS )z
        Conditional addition and subtraction for all supported data types.
        Test intrinsics:
            npyv_ifadd_##SFX, npyv_ifsub_##SFX
        Trh   N)	re   r   rZ  rU  r[  r   ifsubr   ifadd)	r
   rv   rw   r`   
false_maskr  r  r  r  r   r   r   test_mask_conditional  s   z_SIMD_ALL.test_mask_conditionalN)rD   r[   r\   r   r  r&  r2  r6  r<  rA  rD  rF  r   r  r  rQ  re  rs  ry  r  r   r  r  r  r  r  r  r  r  r  r   r   r   r   r    s:    
($ /r  )b8b16b32b64)r   r   r(  r)  r   r   r   r   )rR  rS  )rR  )rS  r@   rS   r   (rT   )ztarget 'z$' isn't supported by current machinez' isn't supported by NPYVz"' doesn't support double-precisionrS  )r   r	   rU   Testr   )reason)-r   r   r   r  numpy.core._simdr   numpy.core._multiarray_umathr   r   r]   r   r   r   r   r  bool_sfxint_sfxfp_sfxall_sfxtests_registryitemsrU   r   simd
simd_widthrV   pretty_namelenrW   skipdictskip_sfxr   ra  clsr	   getskip_minhrr   typerD   tclsr  globalsr   r   r   r   <module>   sj   c4B @    
&