B
     \R>                 @   sH  d dl mZmZmZ d dlZd dlmZ d dlZd dl	Z	d dl
mZ d dlmZmZ d dlm  mZ ddlmZmZmZmZmZmZmZmZmZmZ dd	lmZmZm Z m!Z! ee	j"ej#ej#d
d Z$ee	j%ej#ej#dd Z&ee	j'ej(ej(ee	j'ej)ej)dd Z*ee	j+ej,ej,dd Z-eej.dd Z/eej#ej.eej0ej.eej1ej.dd Z2eej.ej#eej.ej1eej.ej0dd Z3ee	j4ej5ej6dd Z7ee	j8ej5ej6ej#dd Z9dd Z:ee;ej<dd Z=ee;e>ej#d d! Z?ee@ej<d"d# ZAee@e>ej#d$d% ZBd&d' ZCeeDejEd(d) ZFeeDejEej6d*d+ ZGeeHej#eeIej#d,d- ZJeeKe>ej#d.d/ ZLeejMej#eejNej#d0d1 ZOeejPd2d3 ZQeejRd4d5 ZSeeTej#d6d7 ZUeeVejWd8d9 ZXeeYejZd:d; Z[ed<ej#ej#d=d> Z\ee]ej^d?d@ Z_ee`ejadAdB ZbeecdCdD Zdeecej<dEdF ZedGdH ZfdIdJ ZgeegejMeegejhdKdL ZieefejMeefejhdMdN Zjd dOlkmlZlmmZm d dPlnmoZo eelejpejeelejqejdQdR Zreoe@dSdT Zseoe;dUdV ZtdS )W    )print_functionabsolute_importdivisionN)reduce)ir)TypeConstant   )
lower_builtinlower_getattrlower_getattr_generic
lower_castlower_constantiternext_implcall_getitercall_iternextimpl_ret_borrowedimpl_ret_untracked   )typingtypescgutilsutilsc             C   s   |  tj|}||||S )z3
    Implement `x is not y` as `not (x is y)`.
    )get_functionoperatoris_not_)contextbuildersigargsZis_impl r!   5lib/python3.7/site-packages/numba/targets/builtins.pygeneric_is_not   s    r#   c             C   sb   |j \}}||krX|jr"tdq^y| tj|}W n tk
rJ   tjS X |||S ntjS dS )z-
    Default implementation for `x is y`
    zno default `is` implementationN)r    ZmutableNotImplementedErrorr   r   eqr   	false_bit)r   r   r   r    Zlhs_typeZrhs_typeZeq_implr!   r!   r"   
generic_is   s    

r'   c             C   s@   |j \}}d}|j|jkrd}ttd|}t| ||j|S )Nr   r	   )r    literal_valuer   r   IntTyper   return_type)r   r   r   r    arg1arg2valresr!   r!   r"   const_eq_impl6   s    
r/   c             C   s@   |j \}}d}|j|jkrd}ttd|}t| ||j|S )Nr   r	   )r    r(   r   r   r)   r   r*   )r   r   r   r    r+   r,   r-   r.   r!   r!   r"   const_ne_implA   s    
r0   c             C   s4   |  }| ||||}| ||}|| ||||S )z>
    Deferred.__getattr__ => redirect to the actual type.
    )getcastZget_getattr)r   r   typvalueattrZ
inner_typer-   impr!   r!   r"   deferred_getattrM   s    r7   c             C   s0   |  |||| }| j| }||| |S )N)r2   r1   data_model_managersetZmake_uninitialized)r   r   fromtytotyr-   Zactualmodelr!   r!   r"   any_to_deferredW   s    
r=   c             C   s*   | j | }|||}| ||| |S )N)r8   r1   r2   )r   r   r:   r;   r-   r<   r!   r!   r"   deferred_to_any_   s    
r>   c             C   s0   |\}}| ||g}||}t| ||j|S )N)geploadr   r*   )r   r   r   r    base_ptridxelem_ptrr.   r!   r!   r"   getitem_cpointerj   s    
rD   c             C   s(   |\}}}| ||g}||| d S )N)r?   Zstore)r   r   r   r    rA   rB   r-   rC   r!   r!   r"   setitem_cpointerr   s    
rE   c       	         sX   t |t |kst||ft |dks,t fdd}t||}t||\}}|S )Nr   c                s   | \}}|\}}j ||}|d k	s*t |||} |||}ttj||}|}| ||f}	 	|	||}
||
fS )N)
Ztyping_contextZunify_typesAssertionErrorr2   r   	signaturer   Zbooleanr   Zselect)Zaccumulatorr4   ZacctyZaccZvtyvtyZcmpsiggeZpredr.   )r   cmpopr   r!   r"   binary_minmax   s    z do_minmax.<locals>.binary_minmax)lenrF   zipr   )	r   r   argtysr    rK   rL   ZtypvalsZrestyZresvalr!   )r   rK   r   r"   	do_minmax{   s    
rP   c             C   s0   t |jd }t||d }t| |||tjS )Nr   )listr    r   unpack_tuplerP   r   gt)r   r   r   r    rO   r!   r!   r"   max_iterable   s    rT   c             C   s   t | ||j|tjS )N)rP   r    r   rS   )r   r   r   r    r!   r!   r"   
max_vararg   s    rU   c             C   s0   t |jd }t||d }t| |||tjS )Nr   )rQ   r    r   rR   rP   r   lt)r   r   r   r    rO   r!   r!   r"   min_iterable   s    rW   c             C   s   t | ||j|tjS )N)rP   r    r   rV   )r   r   r   r    r!   r!   r"   
min_vararg   s    rX   c             C   s"   t jrd| jf S d| jf S d S )Nzllvm.rint.f%dzllvm.round.f%d)r   IS_PY3bitwidth)tpr!   r!   r"   _round_intrinsic   s    r\   c       
      C   sp   |j d }| |}|j}t||g}|j|t|d}|||}	tj	r`|
|	| |j}	t| ||j|	S )Nr   )name)r    Zget_value_typemoduler   ZfunctionZget_or_insert_functionr\   Zcallr   rY   Zfptosir*   r   )
r   r   r   r    flttyZlltyr^   Zfntyfnr.   r!   r!   r"   round_impl_unary   s    

ra   c                sN   |j d }tt|t||  fdd}| ||||}t| ||j|S )Nr   c                s   t | st | r| S |dkrp|dkr:d|d  }d}nd| }d}| | | }t |r`| S  || | S d|  }| | } || S d S )Nr      g      $@gMDg      ?)mathZisinfZisnan)xZndigitsZpow1Zpow2y)_roundr!   r"   round_ndigits   s    

z(round_impl_binary.<locals>.round_ndigits)	r    r   ZExternalFunctionr\   r   rG   compile_internalr   r*   )r   r   r   r    r_   rg   r.   r!   )rf   r"   round_impl_binary   s    
ri   c             C   s0   |j \}|\}| ||||j}t| ||j|S )N)r    r2   r*   r   )r   r   r   r    rI   r-   r.   r!   r!   r"   int_impl   s    rj   c             C   s   |j }|j}t|jdkrr|j\}|\}t|tjrT| ||||}t| ||j |S | ||||}	| 	|d}
n@t|jdkr|j\}}|\}	}
| ||	||}	| ||
||}
| 
||}|	|_|
|_| }t| ||j |S )Nr	   r   r   )r*   Zunderlying_floatrM   r    
isinstancer   ZComplexr2   r   get_constantZmake_complexrealimag	_getvalue)r   r   r   r    Zcomplex_typeZ
float_typeZargtyargr.   rm   rn   ZrealtyZimagtyZcmplxr!   r!   r"   complex_impl   s(    
rq   c             C   sJ   t |jtjr&| tj|}|||S |\}|j\}| ||||jS dS )z1
    Call a number class, e.g. np.int32(...)
    N)	rk   r*   r   ZArrayr   npZarrayr    r2   )r   r   r   r    implr-   Zvaltyr!   r!   r"   number_constructor  s    
rt   c             C   s   |   S )N)get_dummy_value)r   r   rI   pyvalr!   r!   r"   constant_dummy  s    rw   c             C   s0   |  |}| j|||t|d}|||S )N)info)Zget_function_pointer_typeZadd_dynamic_addrZget_pointerstrZbitcast)r   r   rI   rv   ZptrtyZptrvalr!   r!   r"   constant_function_pointer   s    
rz   c             C   s   |   S )z&
    One-argument type() builtin.
    )ru   )r   r   r   r    r!   r!   r"   	type_impl*  s    r{   c             C   s    |j \}|\}t| |||}|S )N)r    r   )r   r   r   r    rI   r-   itervalr!   r!   r"   	iter_impl2  s    r}   c          	   C   sX   |j \}|\}t| |||}|j|| dd | j|td W d Q R X | S )NF)Zlikelyr!   )	r    r   Zif_thenr   Zis_validZ	call_convZreturn_user_excStopIterationZyielded_value)r   r   r   r    Zitertyr|   r.   r!   r!   r"   	next_impl:  s    r   znot inc             C   s"   dd }|  ||||}||S )Nc             S   s   t || S )N)r   contains)abr!   r!   r"   in_implK  s    znot_in.<locals>.in_impl)rh   r   )r   r   r   r    r   r.   r!   r!   r"   not_inI  s    r   c             C   s0   |j \}|j}| |t|j}t| ||j|S )N)r    r*   rl   rM   r   r   )r   r   r   r    rI   rettyr.   r!   r!   r"   constsized_lenT  s    r   c             C   s    |j \}t|rtjS tjS d S )N)r    rM   r   Ztrue_bitr&   )r   r   r   r    rI   r!   r!   r"   
sized_bool\  s    r   c             C   s    |j }| |}t| ||j |S )N)r*   Zget_constant_undefr   )r   r   r   r    r   r.   r!   r!   r"   lower_empty_tupled  s    
r   c             C   s   |\}t | ||j|S )N)r   r*   )r   r   r   r    r-   r!   r!   r"   lower_tuplej  s    r   c             C   sd   t | tjrF| j}|dkr(ttjjS |dkr>ttjjS t	dt | tj
rX| jS t	dd S )N    @   zUnsupported floating point typezUnsupported type)rk   r   FloatrZ   rr   finfofloat32maxfloat64r$   Integermaxval)r3   bwr!   r!   r"   get_type_max_valueq  s    r   c             C   sd   t | tjrF| j}|dkr(ttjjS |dkr>ttjjS t	dt | tj
rX| jS t	dd S )Nr   r   zUnsupported floating point typezUnsupported type)rk   r   r   rZ   rr   r   r   minr   r$   r   minval)r3   r   r!   r!   r"   get_type_min_value}  s    r   c       
      C   s   |j d j}|j}t|tjr<t|}|j}t	||}n\t|tj
r|dkrZt }n|dkrlt }ntdttd|}	t	|t|	j}t| |||S )Nr   r   r   z+llvmlite only supports 32 and 64 bit floatszfloat{})r    dtyperZ   rk   r   r   r   r)   r   r   r   	FloatType
DoubleTyper$   getattrrr   formatr   r   r   )
r   r   r   r    r3   r   ltyr-   r.   nptyr!   r!   r"   lower_get_type_min_value  s    


r   c       
      C   s   |j d j}|j}t|tjr<t|}|j}t	||}n\t|tj
r|dkrZt }n|dkrlt }ntdttd|}	t	|t|	j}t| |||S )Nr   r   r   z+llvmlite only supports 32 and 64 bit floatszfloat{})r    r   rZ   rk   r   r   r   r)   r   r   r   r   r   r$   r   rr   r   r   r   r   )
r   r   r   r    r3   r   r   r-   r.   r   r!   r!   r"   lower_get_type_max_value  s    


r   )
IndexValueIndexValueType)overloadc             C   s2   |j }|\}}t|| |}||_||_| S )N)r*   r   Zcreate_struct_proxyindexr4   ro   )r   r   r   r    r3   r   r4   Zindex_valuer!   r!   r"   impl_index_value  s    r   c             C   s$   t | tr t |tr dd }|S d S )Nc             S   s   | j |j kr|S | S )N)r4   )indval1indval2r!   r!   r"   min_impl  s    zindval_min.<locals>.min_impl)rk   r   )r   r   r   r!   r!   r"   
indval_min  s    

r   c             C   s$   t | tr t |tr dd }|S d S )Nc             S   s   |j | j kr|S | S )N)r4   )r   r   r!   r!   r"   max_impl  s    zindval_max.<locals>.max_impl)rk   r   )r   r   r   r!   r!   r"   
indval_max  s    

r   )uZ
__future__r   r   r   rc   	functoolsr   Znumpyrr   r   Zllvmliter   Zllvmlite.llvmpy.corer   r   ZllvmpyZcoreZlcZimputilsr
   r   r   r   r   r   r   r   r   r    r   r   r   r   is_notZAnyr#   r   r'   r%   ZLiteralZIntegerLiteralr/   neZStringLiteralr0   ZDeferredTyper7   ZOptionalZBooleanr=   r>   getitemZCPointerr   rD   setitemrE   rP   r   Z	BaseTuplerT   ZVarArgrU   r   rW   rX   r\   roundr   ra   ri   intfloatrj   complexrq   ZNumberClassZTypeRefrt   ZDummyrw   ZExternalFunctionPointerrz   typer{   iterZIterableTyper}   nextZIteratorTyper   r   rM   Z
ConstSizedr   boolSizedr   tupler   r   r   r   ZDTyper   r   Znumba.typing.builtinsr   r   Znumba.extendingr   ZintpZuintpr   r   r   r!   r!   r!   r"   <module>   st   0	

		&



	
