B
     \}                 @   sd
  d dl mZmZmZ 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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 ddlmZ dd	lmZmZmZmZ d
d Zdd Z dd Z!dd Z"dd Z#dd Z$dd Z%ee&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j,sZeej-ej'ej'e+ eej.ej'ej'e+ eej/ej'ej'eej0ej'ej'dd Z1eej2ej'ej'eej3ej'ej'dd Z4d d! Z5d"d# Z6eej7ej'ej8eej9ej'ej8eej7ej:ej8eej9ej:ej8d$d% Z;d&d' Z<d(d) Z=d*d+ Z>d,d- Z?d.d/ Z@d0d1 ZAd2d3 ZBd4d5 ZCd6d7 ZDd8d9 ZEd:d; ZFd<d= ZGd>d? ZHd@dA ZIdBdC ZJdDdE ZKdFdG ZLdHdI ZMdJdK ZNdLdM ZOdNdO ZPdPdQ ZQdRdS ZReejSejTejTeD eejUejTejTeE eejVejTejTe@ eejWejTejTeA eejXejTejTeB eejYejTejTeC eejZejTeQ eej[ejTeR dTdU Z\dVdW Z]e\  e]  dXdY Z^dZd[ Z_d\d] Z`d^d_ Zad`da Zbdbdc Zcee&ej:ej:ddddeZdddfdgZeddhdiZfdjdk Zgdldm Zhdndo Zidpdq Zjdrds Zkdtdu Zldvdw Zmdxdy Zndzd{ Zod|d} Zpd~d Zqej:Zreejserere^ eejterere^ eejuerere_ eejverere_ eejwerere` eejxerere` eej)ereref eej*ereref eej/ererea eej0ererea ej,s*eej-ererea eej.ererea eej2ereree eej3ereree eej7erereg eej9erereg ee7erereg eejSererel eejUererem eejVerereh eejWererei eejXererej eejYererek eeyeren eejZereo eej[erep [reejzddd Z{eejzddd Z|edejzdd Z}dd Z~dd Zdd Zx@ej:ej'fD ]0Zeede~ eede edee qW eej7ejzejzeej9ejzejzee7ejzejzdd Zdd Zdd Zdd ZedZdd Zdd Zdd Zdd Zdd Zdd ZejzZreejserere eejterere eejuerere eejverere eejwerere eejxerere eej/erere eej0erere ej,seej-erere eej.erere eejZere eej[ere eejSerere eejUerere eeyere [redejedejdd Zdd ZeeejTdd Zeeej'dd Zeeej:dd Zeeejzdd Zx*ej'ej:ejzfD ]Zreejere qW eejejTe eej8ej'eej8ej:eej8ejzdd Zeej'ej'dd Zeej'ejdd Zeej:ej:dd Zeej'ej:dd Zeej:ej'dd Zeej:ejzeej'ejzdd Zeejzejzdd Zeejejdd ZeejejddĄ Zeej8ejddƄ ZeejzddȄ Zeej'eej:eejddʄ ZdS )    )print_functionabsolute_importdivisionN)ir)TypeConstant   )lower_builtinlower_getattrlower_getattr_generic
lower_castlower_constantimpl_ret_borrowedimpl_ret_untracked)optional   )typingtypescgutilsutilsc             C   s   | j rdgS g S dS )z;
    Return the modifier flags for integer arithmetic.
    ZnswN)signed)Zrettype r   4lib/python3.7/site-packages/numba/targets/numbers.py_int_arith_flags   s    r   c             C   s\   |\}}|j \}}| ||||j}| ||||j}	|j||	t|jd}
t| ||j|
S )N)flags)argscastreturn_typeaddr   r   )contextbuildersigr   vavbtatbabresr   r   r   int_add_impl%   s    
r)   c             C   s\   |\}}|j \}}| ||||j}| ||||j}	|j||	t|jd}
t| ||j|
S )N)r   )r   r   r   subr   r   )r   r    r!   r   r"   r#   r$   r%   r&   r'   r(   r   r   r   int_sub_impl.   s    
r+   c             C   s\   |\}}|j \}}| ||||j}| ||||j}	|j||	t|jd}
t| ||j|
S )N)r   )r   r   r   mulr   r   )r   r    r!   r   r"   r#   r$   r%   r&   r'   r(   r   r   r   int_mul_impl7   s    
r-   c             C   s`  |j |j kst| d}| d}t||}t||}||d|| |j|d|| d}	|j||	dd |	||}
|
||}|d||||}|d||}|||}||j\}}| ||
| ||| W d	Q R X |. |||
|| ||||| W d	Q R X W d	Q R X W d	Q R X ||||fS )
a@  
    Reference Objects/intobject.c
    xdivy = x / y;
    xmody = (long)(x - (unsigned long)xdivy * y);
    /* If the signs of x and y differ, and the remainder is non-0,
     * C89 doesn't define whether xdivy is now the floor or the
     * ceiling of the infinitely precise quotient.  We want the floor,
     * and we have it iff the remainder's sign matches y's.
     */
    if (xmody && ((y ^ xmody) < 0) /* i.e. and signs differ */) {
        xmody += y;
        --xdivy;
        assert(xmody && ((y ^ xmody) >= 0));
    }
    *p_xdivy = xdivy;
    *p_xmody = xmody;
    r   r   z==T)likely<z!=N)typeAssertionErrorr   Zalloca_once_valueand_Zicmp_signedZminvalif_thennot_ZsdivZsremxorif_elsestorer*   r   load)r   r    tyxyZEROONEZresdivZresmodZis_overflowZxdivyZxmodyZy_xor_xmody_ltzZxmody_istrueZcondZif_different_signsZif_same_signsr   r   r   int_divmod_signed@   s,    

2r?   c             C   s2   |j rt| ||||S ||||||fS dS )zD
    Integer divmod(x, y).  The caller must ensure that y != 0.
    N)r   r?   ZudivZurem)r   r    r:   r;   r<   r   r   r   
int_divmody   s    r@   c          
   C   s  |\}}|j \}}|j}	t|	tjr*|	j}	| ||||	}
| ||||	}tj||
j	dd}tj||
j	dd}|j
t||dd~\}}|. | j||fs||| ||| W d Q R X |2 t| ||	|
|\}}||| ||| W d Q R X W d Q R X ||fS )Nquot)nameremF)r/   )r   r   
isinstancer   ZUniTupleZdtyper   r   alloca_oncer1   r7   is_scalar_zeroerror_modelfp_zero_divisionr8   r@   )r   r    r!   r   Zzerodiv_messager"   r#   r$   r%   r:   r&   r'   rA   rC   if_zeroif_non_zeroqrr   r   r   _int_divmod_impl   s*    

 rM   c             C   s0   t | |||d\}}t|||||fS )Nzinteger divmod by zero)rM   r   
pack_arrayr9   )r   r    r!   r   rA   rC   r   r   r   int_divmod_impl   s    

rO   c             C   s   t | |||d\}}||S )Nzinteger division by zero)rM   r9   )r   r    r!   r   rA   rC   r   r   r   int_floordiv_impl   s    

rP   c          	   C   sx   |\}}|j \}}| ||||j}| ||||j}	t||	 | j|d W d Q R X |||	}
t| ||j|
S )N)zdivision by zero)	r   r   r   r   rI   rG   rH   fdivr   )r   r    r!   r   r"   r#   r$   r%   r&   r'   r(   r   r   r   int_truediv_impl   s    
rR   c             C   s   t | |||d\}}||S )Nzinteger modulo by zero)rM   r9   )r   r    r!   r   rA   rC   r   r   r   int_rem_impl   s    

rS   c             C   s*   t |tjr"| jjs"d|jd > S dS d S )Nr.   r   F)rD   r   IntegerrG   Zraise_on_fp_zero_divisionbitwidth)r   r   r   r   r   _get_power_zerodiv_return   s    rV   c                sR   t |jd tj |jt|  fdd}| ||||}t| ||j|S )z@
    a ^ b, where a is an integer or real, and b an integer
    r   c                s   d}| } |dk r`d}| }|dk r.t  rh| dkrJrBS td| dkrh| dkrhdS nd}|}|dkrt| t|S x,|dkr|d@ r|| 9 }|dL }| | 9 } qW |rd| S |S )	Nr   r   Tz&0 cannot be raised to a negative powerr.   Fi   g      ?)OverflowErrorZeroDivisionErrormathpowfloat)r&   r'   rL   invertexp)
is_integertpzerodiv_returnr   r   	int_power   s0    
z!int_power_impl.<locals>.int_power)rD   r   r   rT   r   rV   compile_internalr   )r   r    r!   r   ra   r(   r   )r^   r_   r`   r   int_power_impl   s    
rc   c                s   |j d j}t|tjstt|dkr,t|dk }t|}|j}t|tj	t
| ||  |d |j d |}|j} fdd}	|d}
|}x0|dkr|d@ r|	|
|}
|dL }|	||}qW |rrڇfdd}ndd }|  |t|||
f}
|
S )	zH
    a ^ b, where a is an integer or real, and b a constant integer
    r   i   r   c                s    r  | |S  | |S d S )N)r,   fmul)r&   r'   )r    r^   r   r   r,     s    zstatic_power_impl.<locals>.mulc                s4   | dkr r S t d| dkr,| dkr,dS | S d S )Nr   z&0 cannot be raised to a negative powerr   r.   )rX   )r&   )r`   r   r   invert_impl+  s    z&static_power_impl.<locals>.invert_implc             S   s   d|  S )Ng      ?r   )r&   r   r   r   re   8  s    )r   valuerD   numbersZIntegralNotImplementedErrorabsr   r   rT   rV   r   r1   rb   r   	signature)r   r    r!   r   r]   r\   r_   valltyr,   r(   r&   re   r   )r    r^   r`   r   static_power_impl   s6    


rm   c             C   s"   |j tjf| }t| ||j|S )N)icmplcICMP_SLTr   r   )r   r    r!   r   r(   r   r   r   int_slt_implA  s    rq   c             C   s"   |j tjf| }t| ||j|S )N)rn   ro   ZICMP_SLEr   r   )r   r    r!   r   r(   r   r   r   int_sle_implF  s    rr   c             C   s"   |j tjf| }t| ||j|S )N)rn   ro   ICMP_SGTr   r   )r   r    r!   r   r(   r   r   r   int_sgt_implK  s    rt   c             C   s"   |j tjf| }t| ||j|S )N)rn   ro   ZICMP_SGEr   r   )r   r    r!   r   r(   r   r   r   int_sge_implP  s    ru   c             C   s"   |j tjf| }t| ||j|S )N)rn   ro   ZICMP_ULTr   r   )r   r    r!   r   r(   r   r   r   int_ult_implU  s    rv   c             C   s"   |j tjf| }t| ||j|S )N)rn   ro   ZICMP_ULEr   r   )r   r    r!   r   r(   r   r   r   int_ule_implZ  s    rw   c             C   s"   |j tjf| }t| ||j|S )N)rn   ro   ZICMP_UGTr   r   )r   r    r!   r   r(   r   r   r   int_ugt_impl_  s    rx   c             C   s"   |j tjf| }t| ||j|S )N)rn   ro   ZICMP_UGEr   r   )r   r    r!   r   r(   r   r   r   int_uge_impld  s    ry   c             C   s"   |j tjf| }t| ||j|S )N)rn   ro   ICMP_EQr   r   )r   r    r!   r   r(   r   r   r   int_eq_impli  s    r{   c             C   s"   |j tjf| }t| ||j|S )N)rn   ro   ICMP_NEr   r   )r   r    r!   r   r(   r   r   r   int_ne_impln  s    r}   c       	      C   sJ   |\}t |j}|tj||}||}||||}t| ||j	|S )N)
r   Znullr1   rn   ro   rp   negselectr   r   )	r   r    r!   r   r;   r=   ZltzZnegatedr(   r   r   r   int_abs_impls  s    
r   c             C   s   |\}t | ||j|S )N)r   r   )r   r    r!   r   r;   r   r   r   uint_abs_impl|  s    r   c       	      C   sR   |j \}}|\}}| ||||j}| ||||j}|||}t| ||j|S )N)r   r   r   Zshlr   )	r   r    r!   r   valtyamttyrk   amtr(   r   r   r   int_shl_impl  s    
r   c       	      C   sh   |j \}}|\}}| ||||j}| ||||j}|jjrL|||}n|||}t| ||j|S )N)r   r   r   r   ZashrZlshrr   )	r   r    r!   r   r   r   rk   r   r(   r   r   r   int_shr_impl  s    
r   c             C   sR   |j \}}|\}}| ||||j}| ||||j}	|||	}
t| ||j|
S )N)r   r   r   r3   r   )r   r    r!   r   atbtavbvcavcbcr(   r   r   r   int_and_impl  s    
r   c             C   sR   |j \}}|\}}| ||||j}| ||||j}	|||	}
t| ||j|
S )N)r   r   r   or_r   )r   r    r!   r   r   r   r   r   r   r   r(   r   r   r   int_or_impl  s    
r   c             C   sR   |j \}}|\}}| ||||j}| ||||j}	|||	}
t| ||j|
S )N)r   r   r   r6   r   )r   r    r!   r   r   r   r   r   r   r   r(   r   r   r   int_xor_impl  s    
r   c             C   s:   |j \}|\}||}| ||||j}t| ||j|S )N)r   r~   r   r   r   )r   r    r!   r   typrk   r(   r   r   r   int_negate_impl  s
    
r   c             C   s0   |j \}|\}| ||||j}t| ||j|S )N)r   r   r   r   )r   r    r!   r   r   rk   r(   r   r   r   int_positive_impl  s    r   c             C   sD   |j \}|\}||t|j}| ||||j}t| ||j|S )N)r   r6   r   Zall_onesr1   r   r   r   )r   r    r!   r   r   rk   r(   r   r   r   int_invert_impl  s
    r   c          	   C   sj  |\}t |jd}t |jd}t |jd}|tj||}|tj||}	t||j}
|	d}|	d}|	d}|	d}|	d}|
||| || |||
 || W d	Q R X || |
|	|| W d	Q R X || |||
 || W d	Q R X || |||
 || W d	Q R X || ||
}t| ||j|S )
z
    np.sign(int)
    r   r.   r   z.zeroz.postestz.posz.negz.exitN)r   intr1   rn   ro   rz   rs   r   rE   append_basic_blockZcbranchZ
goto_blockr8   branchZposition_at_endr9   r   r   )r   r    r!   r   r;   POSNEGr=   Zcmp_zeroZcmp_pospresultZbb_zeroZ
bb_postestZbb_posZbb_negZbb_exitr(   r   r   r   int_sign_impl  s6    






r   c             C   s:   |j \}|\}| ||||j}||}t| ||j|S )N)r   r   r   r~   r   )r   r    r!   r   r   rk   r(   r   r   r   bool_negate_impl  s
    
r   c             C   s0   |j \}|\}| ||||j}t| ||j|S )N)r   r   r   r   )r   r    r!   r   r   rk   r(   r   r   r   bool_unary_positive_impl  s    r   c              C   s  t j} ttj| | t ttj| | t ttj| | t ttj	| | t ttj
| | t ttj| | t ttj| | t ttj| | t ttj| | t ttj| | t ttj| | t ttj| | t ttj| t ttj| t ttj| | t ttj| | t tt| | t xt jD ]} ttj| | t  ttj!| | t" ttj#| | t$ ttj%| | t& ttjt j'| t ttjt j'| t ttt j'| t tt(| t) q:W ttjt j*t j*t+ ttj#t j*t j*t+ ttj!t j*t j*t+ ttj%t j*t j*t+ xt j,D ]} ttj| | t+ ttj!| | t- ttj#| | t. ttj%| | t/ ttjt j'| t ttjt j'| t ttt j'| t tt(| t0 q4W d S )N)1r   rT   r	   operatorr   r)   iaddr*   r+   isubr,   r-   imuleqr{   ner}   lshiftr   ilshiftrshiftr   irshiftr~   r   posr   rZ   rc   ipowZunsigned_domainltrv   lerw   gtrx   gery   Floatri   r   IntegerLiteralrq   Zsigned_domainrr   rt   ru   r   )r:   r   r   r   _implement_integer_operators  sP    r   c              C   s   xt jt jfD ]} ttj| | t ttj| | t ttj| | t	 ttj
| | t	 ttj| | t ttj| | t ttj| t qW d S )N)r   BooleanrT   r	   r   r3   r   iandr   r   iorr6   r   ixorr\   r   )r:   r   r   r   _implement_bitwise_operators=  s    r   c             C   s   |j | }t| ||j|S )N)faddr   r   )r   r    r!   r   r(   r   r   r   real_add_implM  s    
r   c             C   s   |j | }t| ||j|S )N)fsubr   r   )r   r    r!   r   r(   r   r   r   real_sub_implR  s    
r   c             C   s   |j | }t| ||j|S )N)rd   r   r   )r   r    r!   r   r(   r   r   r   real_mul_implW  s    
r   c          	   C   sD   t ||d  | j|d W d Q R X |j| }t| ||j|S )Nr   )zdivision by zero)r   rI   rG   rH   rQ   r   r   )r   r    r!   r   r(   r   r   r   real_div_impl\  s    
r   c             C   s   |j |j kst|j }|j}| d|j g}t|||t|f}|||}|jrt	j
|_t	|d}	|j\}
}}t| |	|
|\}}|	|| |	| t||}|||||f}|||fS )Nz.numba.python.rementry)r1   r2   moduleZmanglerr   functionZpointerget_or_insert_functionZis_declarationro   ZLINKAGE_LINKONCE_ODRZlinkageZBuilderr   r   real_divmod_func_bodyr8   Zretr   rE   callr9   )r   r    r;   r<   Zfloattyr   fnamefntyfnZ	fnbuilderZfxZfypmoddivmodZquotientr   r   r   real_divmodc  s     
r   c             C   sv  t ||j}t ||j}t ||j}|||}|||||}||| ||| |d}	|d}
|d}|d||	}|d||	}|d||	}|j	|dd\}}|T |
tj||}||. ||||| ||||| W d Q R X W d Q R X |  |||
|	}||| W d Q R X W d Q R X ~~||}|tj||	}|| tjtjd}|t|j }| tjt||}|||g}|||}|||}t|jd	}|tj||}||||}||| W d Q R X t ||> | ||}||| || |||}||| W d Q R X ||||fS )
Ng        g       g      ?z!=r0   T)r/   )r[   Zdoubleg      ?)!r   rE   r1   fremrQ   r   r8   Zfcmp_unorderedfcmp_orderedr7   rn   ro   r|   r4   r   r   r9   fcmpZFCMP_ONEr   Zfloat32Zfloat64strget_functionrY   Zfloorr   rj   r   realFCMP_OGTZifnotrd   )r   r    ZvxZwxr   ZpdivZ	pfloordivr   r   r=   ZNZEROr>   Z
mod_istrueZwx_ltzZmod_ltzZif_nonzero_modZif_zero_modZwx_ltz_ne_mod_ltzZ
div_istrueZrealtypemapZrealtypeZfloorfnfloordivZfloordivdiffZfloordivincrZHALFZpredr   r   r   r   y  sX    .


( 

r   c          
   C   s   |\}}t j||jdd}t j||jdd}|jt ||dd\}	}
|	F | j|d|s|||}|||}|	|| |	|| W d Q R X |
0 t
| |||\}}|	|| |	|| W d Q R X W d Q R X t |||||fS )NrA   )rB   rC   F)r/   )zmodulo by zero)r   rE   r1   r7   rF   rG   rH   rQ   r   r8   r   rN   r9   )r   r    r!   r   locr;   r<   rA   rC   rI   rJ   rK   rL   r   r   r   real_divmod_impl  s$    
 r   c          
   C   s   |\}}t ||j}|jt ||ddp\}}	|. | j|d|s`|||}
||
| W d Q R X |	$ t	| |||\}}
||
| W d Q R X W d Q R X t
| ||j||S )NF)r/   )zmodulo by zero)r   rE   r1   r7   rF   rG   rH   r   r8   r   r   r   r9   )r   r    r!   r   r   r;   r<   r(   rI   rJ   rC   _r   r   r   real_mod_impl  s    
 
r   c          
   C   s   |\}}t ||j}|jt ||ddp\}}	|. | j|d|s`|||}
||
| W d Q R X |	$ t	| |||\}
}||
| W d Q R X W d Q R X t
| ||j||S )NF)r/   )zdivision by zero)r   rE   r1   r7   rF   rG   rH   rQ   r8   r   r   r   r9   )r   r    r!   r   r   r;   r<   r(   rI   rJ   rA   r   r   r   r   real_floordiv_impl  s    
 
r   c       
      C   sd   |\}}|j }| jr.| tj|}|||}n&tj|tj|j	g}	|
|	||f}t| ||j|S )N)r   Zimplement_powi_as_math_callr   rY   rZ   ro   ZFunctionZ	intrinsicZINTR_POWr1   r   r   r   )
r   r    r!   r   r;   r<   r   impr(   r   r   r   r   real_power_impl%  s    r   c             C   s"   |j tjf| }t| ||j|S )N)r   ro   FCMP_OLTr   r   )r   r    r!   r   r(   r   r   r   real_lt_impl1  s    r   c             C   s"   |j tjf| }t| ||j|S )N)r   ro   ZFCMP_OLEr   r   )r   r    r!   r   r(   r   r   r   real_le_impl6  s    r   c             C   s"   |j tjf| }t| ||j|S )N)r   ro   r   r   r   )r   r    r!   r   r(   r   r   r   real_gt_impl;  s    r   c             C   s"   |j tjf| }t| ||j|S )N)r   ro   ZFCMP_OGEr   r   )r   r    r!   r   r(   r   r   r   real_ge_impl@  s    r   c             C   s"   |j tjf| }t| ||j|S )N)r   ro   FCMP_OEQr   r   )r   r    r!   r   r(   r   r   r   real_eq_implE  s    r   c             C   s"   |j tjf| }t| ||j|S )N)r   ro   FCMP_UNEr   r   )r   r    r!   r   r(   r   r   r   real_ne_implJ  s    r   c             C   s,   |j \}t||}| tj|}|||S )N)r   r   rj   r   rY   Zfabs)r   r    r!   r   r:   implr   r   r   real_abs_implO  s    r   c             C   s,   ddl m} |||d }t| ||j|S )Nr   )mathimplr   ) r   negate_realr   r   )r   r    r!   r   r   r(   r   r   r   real_negate_implV  s    r   c             C   s0   |j \}|\}| ||||j}t| ||j|S )N)r   r   r   r   )r   r    r!   r   r   rk   r(   r   r   r   real_positive_impl\  s    r   c             C   s  |\}t |jd}t |jd}t |jd}t||j}|tj||}	|tj||}
|	|	\}}| |
|| W dQ R X |X |	|
B\}}| |
|| W dQ R X | |
|| W dQ R X W dQ R X W dQ R X W dQ R X ||}t| ||j|S )z
    np.sign(float)
    r   r.   r   N)r   r   r1   r   rE   r   ro   r   r   r7   r8   r9   r   r   )r   r    r!   r   r;   r   r   r=   r   Zis_posZis_negZgt_zeroZnot_gt_zeroZlt_zeroZnot_lt_zeror(   r   r   r   real_sign_implc  s$    4
r   r   c             C   s$   | j |||d}|j}t| |||S )N)rf   )make_complexr   r   )r   r    r   rf   cplxr(   r   r   r   complex_real_impl  s    r   imagc             C   s$   | j |||d}|j}t| |||S )N)rf   )r   r   r   )r   r    r   rf   r   r(   r   r   r   complex_imag_impl  s    r   zcomplex.conjugatec             C   sL   ddl m} | ||jd |d }|||j|_| }t| ||j|S )Nr   )r   r   )	r   r   r   r   r   r   	_getvaluer   r   )r   r    r!   r   r   zr(   r   r   r   complex_conjugate_impl  s
    r   c             C   s   t | |||S )N)r   )r   r    r   rf   r   r   r   real_real_impl  s    r   c             C   s   t |j}t| |||S )N)r   Zget_null_valuer1   r   )r   r    r   rf   r(   r   r   r   real_imag_impl  s    r   c             C   s   t | ||j|d S )Nr   )r   r   )r   r    r!   r   r   r   r   real_conjugate_impl  s    r   c          
   C   sx  |\}}|j d }|j}| j|||d}| j|||d}	| ||}
|j}| }|	 }|
 }| |d}| |d}|d|	j|}|d|	j|}|	||}|
|\}}|8 t| ||||f}| j|||d}|j|
_|j|
_W d Q R X |R tjdtjdi| }tt |jgd }|j||d}|||||f W d Q R X W d Q R X ||}t| ||j|S )	Nr   )rf   r   z==Znumba_cpowfZ
numba_cpow   )rB   )r   underlying_floatZmake_helperr   Z_getpointerget_constantr   r   r   r3   r7   complex_mul_implr   Z	complex64Z
complex128r   r   Zvoidr1   r   r   r9   r   r   )r   r    r!   r   Zcacbr:   ftyr&   r'   cr   ZpaZpbZpcZTWOr=   Zb_real_is_twoZb_imag_is_zeroZb_is_twoZthenZ	otherwiser(   ZcresZ	func_namer   Zcpowr   r   r   complex_power_impl  s<    
&
r   c             C   s   |\}}|j d }| j|||d}| j|||d}| ||}	|j}
|j}|j}|j}||
||	_||||	_|	 }t| ||j|S )Nr   )rf   )r   r   r   r   r   r   r   r   )r   r    r!   r   cxcyr:   r;   r<   r   r&   r'   r   dr(   r   r   r   complex_add_impl  s    
r   c             C   s   |\}}|j d }| j|||d}| j|||d}| ||}	|j}
|j}|j}|j}||
||	_||||	_|	 }t| ||j|S )Nr   )rf   )r   r   r   r   r   r   r   r   )r   r    r!   r   r   r   r:   r;   r<   r   r&   r'   r   r   r(   r   r   r   complex_sub_impl  s    
r   c             C   s   |\}}|j d }| j|||d}| j|||d}| ||}	|j}
|j}|j}|j}||
|}|||}||
|}|||}||||	_||||	_|	 }t| ||j	|S )z'
    (a+bi)(c+di)=(ac-bd)+i(ad+bc)
    r   )rf   )
r   r   r   r   rd   r   r   r   r   r   )r   r    r!   r   r   r   r:   r;   r<   r   r&   r'   r   r   ZacZbdZadZbcr(   r   r   r   r     s"    
r   nanc             C   s(   dd }|  ||||}t| ||j|S )Nc             S   s   | j }| j}|j }|j}|s(|s(tdt|t|kr||sFtttS || }|||  }t|||  | |||  | S |stttS || }|| | }t| j | | j | | j| | j  | S d S )Nzcomplex division by zero)r   r   rX   ri   complexNAN)r&   r'   ZarealZaimagZbrealZbimagZratioZdenomr   r   r   complex_div1  s*    

z%complex_div_impl.<locals>.complex_div)rb   r   r   )r   r    r!   r   r  r(   r   r   r   complex_div_impl0  s    r  c       	      C   sn   ddl m} |j\}|\}| j|||d}| ||}|||j|_|||j|_| }t| ||j	|S )Nr   )r   )rf   )
r   r   r   r   r   r   r   r   r   r   )	r   r    r!   r   r   r   rk   cmplxr(   r   r   r   complex_negate_implP  s    r  c             C   s   |\}t | ||j|S )N)r   r   )r   r    r!   r   rk   r   r   r   complex_positive_impl\  s    r  c             C   sv   |\}}|j d }| j|||d}| j|||d}|tj|j|j}	|tj|j|j}
||	|
}t| ||j	|S )Nr   )rf   )
r   r   r   ro   r   r   r   r3   r   r   )r   r    r!   r   r   r   r   r;   r<   Zreals_are_eqZimags_are_eqr(   r   r   r   complex_eq_impla  s    
r	  c             C   sv   |\}}|j d }| j|||d}| j|||d}|tj|j|j}	|tj|j|j}
||	|
}t| ||j	|S )Nr   )rf   )
r   r   r   ro   r   r   r   r   r   r   )r   r    r!   r   r   r   r   r;   r<   Zreals_are_neZimags_are_ner(   r   r   r   complex_ne_implm  s    
r
  c             C   s(   dd }|  ||||}t| ||j|S )z)
    abs(z) := hypot(z.real, z.imag)
    c             S   s   t | j| jS )N)rY   Zhypotr   r   )r   r   r   r   complex_abs}  s    z%complex_abs_impl.<locals>.complex_abs)rb   r   r   )r   r    r!   r   r  r(   r   r   r   complex_abs_imply  s    r  znumber.itemc             C   s   |d S )z;
    The no-op .item() method on booleans and numbers.
    r   r   )r   r    r!   r   r   r   r   number_item_impl  s    r  c             C   s:   |j \}|\}| ||||j}||}t| ||j|S )N)r   r   r   r5   r   )r   r    r!   r   r   rk   Zistruer(   r   r   r   number_not_impl  s
    
r  c             C   s
   |\}|S )Nr   )r   r    r!   r   rk   r   r   r   bool_as_bool  s    r  c             C   s   |\}| d|t|jdS )Nz!=r   )Zicmp_unsignedr   r   r1   )r   r    r!   r   rk   r   r   r   int_as_bool  s    r  c             C   s    |\}| tj|t|jdS )Ng        )r   ro   r   r   r   r1   )r   r    r!   r   rk   r   r   r   float_as_bool  s    r  c             C   sd   |j \}|\}| |||}|j|j }}t|jd}	|tj	||	}
|tj	||	}|
|
|S )Ng        )r   r   r   r   r   r   r1   r   ro   r   r   )r   r    r!   r   r   rk   r  r   r   ZzeroZreal_istrueZimag_istruer   r   r   complex_as_bool  s    r  c             C   s$   |  ||j|j}| |||j|S )N)get_constant_genericliteral_typeliteral_valuer   )r   r    fromtytotyrk   litr   r   r   literal_int_to_number  s
    r  c             C   s\   |j |j kr|S |j |j k r.||| |S |jrF||| |S ||| |S d S )N)rU   Ztruncget_value_typer   Zsextzext)r   r    r  r  rk   r   r   r   integer_to_integer  s    r  c             C   s   | || |S )N)Zinttoptrr  )r   r    r  r  rk   r   r   r   integer_to_voidptr  s    r  c             C   s2   |  |}|j|jk r"|||S |||S d S )N)r  rU   ZfpextZfptrunc)r   r    r  r  rk   rl   r   r   r   float_to_float  s    
r  c             C   s,   |  |}|jr|||S |||S d S )N)r  r   ZsitofpZuitofp)r   r    r  r  rk   rl   r   r   r   integer_to_float  s    
r  c             C   s,   |  |}|jr|||S |||S d S )N)r  r   ZfptosiZfptoui)r   r    r  r  rk   rl   r   r   r   float_to_integer	  s    
r   c             C   s@   |  ||||j}| |jd}| ||}||_||_| S )Nr   )r   r   r   r   r   r   r   )r   r    r  r  rk   r   r   r  r   r   r   non_complex_to_complex  s    r!  c       	      C   sX   |j }|j }| j|||d}| ||}| ||j|||_| ||j|||_| S )N)rf   )r   r   r   r   r   r   )	r   r    r  r  rk   ZsrctyZdsttysrcdstr   r   r   complex_to_complex  s    r$  c             C   s   |  |||S )N)is_true)r   r    r  r  rk   r   r   r   any_to_boolean'  s    r&  c             C   s"   | |t }| ||tj|S )N)r  r   r   r   r   Zint32)r   r    r  r  rk   Zasintr   r   r   boolean_to_any+  s    r'  c             C   s"   |  ||j|j}| ||j|S )N)r  r  r  r%  )r   r    r  r  rk   r  r   r   r   literal_int_to_boolean2  s
    r(  c             C   s6   |j }| |||j}| |||j}tj||fS )N)r   r  r   r   r   r   Zliteral_struct)r   r    r:   pyvalr   r   r   r   r   r   constant_complex>  s    r*  c             C   s   |  |}||S )N)r  )r   r    r:   r)  rl   r   r   r   constant_integerE  s    
r+  )N)N)N)Z
__future__r   r   r   rY   rg   ZnumpyZnpr   Zllvmliter   Zllvmlite.llvmpy.corer   r   ZllvmpyZcorero   Zimputilsr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r)   r+   r-   r?   r@   rM   divmodrT   rO   r   	ifloordivrP   ZIS_PY3r   ZidivtruedivitruedivrR   r   imodrS   rV   rc   rZ   r   r   r   rm   rq   rr   rt   ru   rv   rw   rx   ry   r{   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zbooleanr   r   r   r   r   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r:   r   r   r*   r   r,   r   ri   ZComplexr   r   r   r   r   r   clsr   r   r   r   r[   r  r  r  r  r	  r
  r  r   Numberr  r  boolr  r  r  r  r5   r  r  Zvoidptrr  r  r  r   r!  r$  ZAnyr&  r'  r(  r*  r+  r   r   r   r   <module>   sv  $			9
		+ >							*0l

* 
	

