o
    1Æ&iR!  ã                   @   s&  d dl Z d dlmZ d dlmZmZ ddlm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 d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3d4d5d6d7d8d9d:d;d<d=d>d?d@œZdAdB„ ZG dCdD„ dDe ƒZ!dEdF„ Z"dS )Gé    N)Úir)ÚcgutilsÚtargetconfigé   )Únvvmc                 C   sN   dt |ƒ d }t t |¡t t |¡¡t |¡t |¡f¡}t | ||¡S )NZ___numba_atomic_iZ	_cas_hack)Ústrr   ÚFunctionTypeÚIntTypeÚPointerTyper   Úget_or_insert_function)ÚlmodÚisizeÚfnameÚfnty© r   ú?C:\wamp64\www\opt\env\Lib\site-packages\numba/cuda/nvvmutils.pyÚdeclare_atomic_cas_int   s   þÿr   c                 C   s   |   |||dd¡}|  |d¡S )NÚ	monotonicr   )ZcmpxchgZextract_value)Úbuilderr   r   ÚptrÚcmpÚvalÚoutr   r   r   Úatomic_cmpxchg   s   r   c                 C   s6   d}t  t  ¡ t  t  ¡ d¡t  ¡ f¡}t | ||¡S )Nz#llvm.nvvm.atomic.load.add.f32.p0f32r   ©r   r   Z	FloatTyper
   r   r   ©r   r   r   r   r   r   Údeclare_atomic_add_float32   s
   
ÿr   c                 C   sP   t  ¡  ¡ }|jdkrd}nd}t t ¡ t t ¡ ¡t ¡ f¡}t 	| ||¡S )N)é   r   z#llvm.nvvm.atomic.load.add.f64.p0f64Z___numba_atomic_double_add)
r   ZConfigStackÚtopZcompute_capabilityr   r   Ú
DoubleTyper
   r   r   )r   Úflagsr   r   r   r   r   Údeclare_atomic_add_float64   s   

ÿr!   c                 C   ó4   d}t  t  ¡ t  t  ¡ ¡t  ¡ f¡}t | ||¡S )NZ___numba_atomic_float_subr   r   r   r   r   Údeclare_atomic_sub_float32'   ó
   
ÿr#   c                 C   r"   )NZ___numba_atomic_double_sub©r   r   r   r
   r   r   r   r   r   r   Údeclare_atomic_sub_float64.   r$   r&   c                 C   ó:   d}t  t  d¡t  t  d¡¡t  d¡f¡}t | ||¡S )Nz"llvm.nvvm.atomic.load.inc.32.p0i32é    ©r   r   r	   r
   r   r   r   r   r   r   Údeclare_atomic_inc_int325   ó
   ÿr*   c                 C   r'   )NZ___numba_atomic_u64_incé@   r)   r   r   r   r   Údeclare_atomic_inc_int64<   r+   r-   c                 C   r'   )Nz"llvm.nvvm.atomic.load.dec.32.p0i32r(   r)   r   r   r   r   Údeclare_atomic_dec_int32C   r+   r.   c                 C   r'   )NZ___numba_atomic_u64_decr,   r)   r   r   r   r   Údeclare_atomic_dec_int64J   r+   r/   c                 C   r"   )NZ___numba_atomic_float_maxr   r   r   r   r   Údeclare_atomic_max_float32Q   r$   r0   c                 C   r"   )NZ___numba_atomic_double_maxr%   r   r   r   r   Údeclare_atomic_max_float64X   r$   r1   c                 C   r"   )NZ___numba_atomic_float_minr   r   r   r   r   Údeclare_atomic_min_float32_   r$   r2   c                 C   r"   )NZ___numba_atomic_double_minr%   r   r   r   r   Údeclare_atomic_min_float64f   r$   r3   c                 C   r"   )NZ___numba_atomic_float_nanmaxr   r   r   r   r   Údeclare_atomic_nanmax_float32m   r$   r4   c                 C   r"   )NZ___numba_atomic_double_nanmaxr%   r   r   r   r   Údeclare_atomic_nanmax_float64t   r$   r5   c                 C   r"   )NZ___numba_atomic_float_nanminr   r   r   r   r   Údeclare_atomic_nanmin_float32{   r$   r6   c                 C   r"   )NZ___numba_atomic_double_nanminr%   r   r   r   r   Údeclare_atomic_nanmin_float64‚   r$   r7   c                 C   s,   d}t  t  d¡t  d¡f¡}t | ||¡S )NZcudaCGGetIntrinsicHandler,   r(   ©r   r   r	   r   r   r   r   r   r   Ú declare_cudaCGGetIntrinsicHandle‰   s
   
ÿr9   c                 C   s4   d}t  t  d¡t  d¡t  d¡f¡}t | ||¡S )NZcudaCGSynchronizer(   r,   r8   r   r   r   r   Údeclare_cudaCGSynchronize   s
   ÿr:   c                 C   s`   | j jj}t | d¡d ¡}tj||jdtj	d}d|_
d|_||_|  |t t d¡¡d¡S )	Nzutf-8ó    Ú_str)ÚnameZ	addrspaceZinternalTé   Zgeneric)Zbasic_blockÚfunctionÚmoduler   Zmake_bytearrayÚencodeZadd_global_variableÚtyper   ZADDRSPACE_CONSTANTÚlinkageZglobal_constantZinitializerZaddrspacecastr   r
   r	   )r   Úvaluer   ÚcvalÚglr   r   r   Údeclare_string—   s   
ÿrG   c                 C   s8   t  t  d¡¡}t  t  d¡||g¡}t | |d¡}|S )Nr>   r(   Úvprintf)r   r
   r	   r   r   r   )r   Z	voidptrtyZ	vprintftyrH   r   r   r   Údeclare_vprint£   s   rI   zllvm.nvvm.read.ptx.sreg.tid.xzllvm.nvvm.read.ptx.sreg.tid.yzllvm.nvvm.read.ptx.sreg.tid.zzllvm.nvvm.read.ptx.sreg.ntid.xzllvm.nvvm.read.ptx.sreg.ntid.yzllvm.nvvm.read.ptx.sreg.ntid.zzllvm.nvvm.read.ptx.sreg.ctaid.xzllvm.nvvm.read.ptx.sreg.ctaid.yzllvm.nvvm.read.ptx.sreg.ctaid.zz llvm.nvvm.read.ptx.sreg.nctaid.xz llvm.nvvm.read.ptx.sreg.nctaid.yz llvm.nvvm.read.ptx.sreg.nctaid.zz llvm.nvvm.read.ptx.sreg.warpsizezllvm.nvvm.read.ptx.sreg.laneid)ztid.xztid.yztid.zzntid.xzntid.yzntid.zzctaid.xzctaid.yzctaid.zznctaid.xznctaid.yznctaid.zZwarpsizeZlaneidc                 C   s6   | j }t t d¡d¡}t ||t| ¡}|  |d¡S )Nr(   r   )r@   r   r   r	   r   r   ÚSREG_MAPPINGÚcall)r   r=   r@   r   Úfnr   r   r   Ú	call_sregÄ   s   rM   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚSRegBuilderc                 C   s
   || _ d S ©N)r   )Úselfr   r   r   r   Ú__init__Ì   s   
zSRegBuilder.__init__c                 C   ó   t | jd| ƒS )Nztid.%s©rM   r   ©rP   Úxyzr   r   r   ÚtidÏ   ó   zSRegBuilder.tidc                 C   rR   )Nzctaid.%srS   rT   r   r   r   ÚctaidÒ   rW   zSRegBuilder.ctaidc                 C   rR   )Nzntid.%srS   rT   r   r   r   ÚntidÕ   rW   zSRegBuilder.ntidc                 C   rR   )Nz	nctaid.%srS   rT   r   r   r   ÚnctaidØ   rW   zSRegBuilder.nctaidc                 C   sb   t  d¡}| j |  |¡|¡}| j |  |¡|¡}| j |  |¡|¡}| j | j ||¡|¡}|S )Nr,   )	r   r	   r   ZsextrV   rY   rX   ÚaddÚmul)rP   rU   Zi64rV   rY   rZ   Úresr   r   r   ÚgetdimÛ   s   
zSRegBuilder.getdimN)	Ú__name__Ú
__module__Ú__qualname__rQ   rV   rX   rY   rZ   r^   r   r   r   r   rN   Ë   s    rN   c                    s@   t | ƒ‰ ‡ fdd„dD ƒ}tt |d |¡ƒ}|dkr|d S |S )Nc                 3   s    | ]}ˆ   |¡V  qd S rO   )r^   )Ú.0rU   ©Zsregr   r   Ú	<genexpr>æ   s   € z get_global_id.<locals>.<genexpr>rU   r   r   )rN   ÚlistÚ	itertoolsÚislice)r   ÚdimÚitÚseqr   rc   r   Úget_global_idä   s   rk   )#rf   Zllvmliter   Z
numba.corer   r   Zcudadrvr   r   r   r   r!   r#   r&   r*   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r9   r:   rG   rI   rJ   rM   ÚobjectrN   rk   r   r   r   r   Ú<module>   sX    	î