B
      ›\Â  ã               @   sè   d dl mZmZmZ d dlZd dlm  mZ ddl	m
Z
 ddl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dddd d!d"d#d$d%d&d'd(d)œZd*d+„ ZG d,d-„ d-eƒZd.d/„ ZdS )0é    )Úprint_functionÚabsolute_importÚdivisionNé   )Únvvm)Úcurrent_context)Úcgutilsc             C   sL   d}t j t j d¡t j t j d¡¡t j d¡t j d¡f¡}|  ||¡S )NZ___numba_cas_hacké    )ÚlcÚTypeÚfunctionÚintÚpointerÚget_or_insert_function)ÚlmodÚfnameÚfnty© r   ú3lib/python3.7/site-packages/numba/cuda/nvvmutils.pyÚdeclare_atomic_cas_int32	   s    ,r   c             C   s@   d}t j t j ¡ t j t j ¡ d¡t j ¡ f¡}| j||dS )Nz#llvm.nvvm.atomic.load.add.f32.p0f32r   )Úname)r
   r   r   Úfloatr   r   )r   r   r   r   r   r   Údeclare_atomic_add_float32   s     r   c             C   sP   t ƒ jjdkrd}nd}tj tj ¡ tj tj ¡ ¡tj ¡ f¡}|  ||¡S )N)é   r   z#llvm.nvvm.atomic.load.add.f64.p0f64Z___numba_atomic_double_add)	r   ZdeviceZcompute_capabilityr
   r   r   Údoubler   r   )r   r   r   r   r   r   Údeclare_atomic_add_float64   s    r   c             C   s<   d}t j t j ¡ t j t j ¡ ¡t j ¡ f¡}|  ||¡S )NZ___numba_atomic_float_max)r
   r   r   r   r   r   )r   r   r   r   r   r   Údeclare_atomic_max_float32!   s    r   c             C   s<   d}t j t j ¡ t j t j ¡ ¡t j ¡ f¡}|  ||¡S )NZ___numba_atomic_double_max)r
   r   r   r   r   r   )r   r   r   r   r   r   Údeclare_atomic_max_float64(   s    r   c             C   s<   d}t j t j ¡ t j t j ¡ ¡t j ¡ f¡}|  ||¡S )NZ___numba_atomic_float_min)r
   r   r   r   r   r   )r   r   r   r   r   r   Údeclare_atomic_min_float32/   s    r   c             C   s<   d}t j t j ¡ t j t j ¡ ¡t j ¡ f¡}|  ||¡S )NZ___numba_atomic_double_min)r
   r   r   r   r   r   )r   r   r   r   r   r   Údeclare_atomic_min_float646   s    r   c       
      C   s„   t jdt jdt jdi| }t|ƒ}dddœ ||¡}d| d }||||f }tj |¡}tj ||¡}tj 	||g¡}	|  
|	|¡S )	NZsharedZlocalZconstantZf32Zf64)r   r   zllvm.nvvm.ptr.z.to.gen.p0%s.p%d%s)r   ZADDRSPACE_SHAREDZADDRSPACE_LOCALÚADDRSPACE_CONSTANTÚstrÚgetr
   r   r   r   r   )
r   ZelemtypeÚ	addrspaceZaddrspacenameZtynameZs2g_name_fmtZs2g_nameZelem_ptr_tyZelem_ptr_ty_addrspaceZs2g_fntyr   r   r   Úinsert_addrspace_conv=   s    r$   c       	      C   s‚   | j jj}tj |¡}|j|jdtj	d}tj
|_d|_||_tj d¡}tj |tj	¡}|  ||¡}t||tj	ƒ}|  ||g¡S )NÚ_str)r   r#   Té   )Zbasic_blockr   Úmoduler
   ZConstantZstringzZadd_global_variableÚtyper   r    ZLINKAGE_INTERNALZlinkageZglobal_constantZinitializerr   r   r   Zbitcastr$   Úcall)	ÚbuilderÚvaluer   ZcvalZglZchartyZconstcharptrtyZcharptrZconvr   r   r   Údeclare_stringN   s    


r,   c             C   s<   t j t j d¡¡}t j t j ¡ ||g¡}|  |d¡}|S )Nr&   Úvprintf)r
   r   r   r   r   r   )r   Z	voidptrtyZ	vprintftyr-   r   r   r   Údeclare_vprint^   s    r.   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   s8   | j }tj tj ¡ d¡}|j|t| d}|  |d¡S )Nr   )r   )r'   r
   r   r   r   r   ÚSREG_MAPPINGr)   )r*   r   r'   r   Úfnr   r   r   Ú	call_sreg~   s    r1   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   s   t | jd| ƒS )Nztid.%s)r1   r*   )r3   Úxyzr   r   r   Útid‰   s    zSRegBuilder.tidc             C   s   t | jd| ƒS )Nzctaid.%s)r1   r*   )r3   r5   r   r   r   ÚctaidŒ   s    zSRegBuilder.ctaidc             C   s   t | jd| ƒS )Nzntid.%s)r1   r*   )r3   r5   r   r   r   Úntid   s    zSRegBuilder.ntidc             C   s   t | jd| ƒS )Nz	nctaid.%s)r1   r*   )r3   r5   r   r   r   Únctaid’   s    zSRegBuilder.nctaidc             C   s:   |   |¡}|  |¡}|  |¡}| j | j ||¡|¡}|S )N)r6   r8   r7   r*   ÚaddÚmul)r3   r5   r6   r8   r9   Zresr   r   r   Úgetdim•   s
    


zSRegBuilder.getdimN)	Ú__name__Ú
__module__Ú__qualname__r4   r6   r7   r8   r9   r<   r   r   r   r   r2   …   s   r2   c                sD   t | ƒ‰ ‡ fdd„dD ƒ}tt |d |¡ƒ}|dkr<|d S |S d S )Nc             3   s   | ]}ˆ   |¡V  qd S )N)r<   )Ú.0r5   )Úsregr   r   ú	<genexpr>Ÿ   s    z get_global_id.<locals>.<genexpr>r5   r   r   )r2   ÚlistÚ	itertoolsÚislice)r*   ZdimÚitÚseqr   )rA   r   Úget_global_id   s    rH   )Z
__future__r   r   r   rD   Zllvmlite.llvmpy.coreZllvmpyZcorer
   Zcudadrvr   Zapir   Znumbar   r   r   r   r   r   r   r   r$   r,   r.   r/   r1   Úobjectr2   rH   r   r   r   r   Ú<module>   s@   
