U
    ?h   ć                   @   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   śF/var/www/html/venv/lib/python3.8/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   Z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   s4   d}t  t  ” t  t  ” ”t  ” f”}t | ||”S )NZ___numba_atomic_float_subr   r   r   r   r   Śdeclare_atomic_sub_float32'   s
    
’r!   c                 C   s4   d}t  t  ” t  t  ” ”t  ” f”}t | ||”S )NZ___numba_atomic_double_sub©r   r   r   r
   r   r   r   r   r   r   Śdeclare_atomic_sub_float64.   s
    
’r#   c                 C   s:   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   s
    ’r&   c                 C   s:   d}t  t  d”t  t  d””t  d”f”}t | ||”S )NZ___numba_atomic_u64_incé@   r%   r   r   r   r   Śdeclare_atomic_inc_int64<   s
    ’r(   c                 C   s:   d}t  t  d”t  t  d””t  d”f”}t | ||”S )Nz"llvm.nvvm.atomic.load.dec.32.p0i32r$   r%   r   r   r   r   Śdeclare_atomic_dec_int32C   s
    ’r)   c                 C   s:   d}t  t  d”t  t  d””t  d”f”}t | ||”S )NZ___numba_atomic_u64_decr'   r%   r   r   r   r   Śdeclare_atomic_dec_int64J   s
    ’r*   c                 C   s4   d}t  t  ” t  t  ” ”t  ” f”}t | ||”S )NZ___numba_atomic_float_maxr   r   r   r   r   Śdeclare_atomic_max_float32Q   s
    
’r+   c                 C   s4   d}t  t  ” t  t  ” ”t  ” f”}t | ||”S )NZ___numba_atomic_double_maxr"   r   r   r   r   Śdeclare_atomic_max_float64X   s
    
’r,   c                 C   s4   d}t  t  ” t  t  ” ”t  ” f”}t | ||”S )NZ___numba_atomic_float_minr   r   r   r   r   Śdeclare_atomic_min_float32_   s
    
’r-   c                 C   s4   d}t  t  ” t  t  ” ”t  ” f”}t | ||”S )NZ___numba_atomic_double_minr"   r   r   r   r   Śdeclare_atomic_min_float64f   s
    
’r.   c                 C   s4   d}t  t  ” t  t  ” ”t  ” f”}t | ||”S )NZ___numba_atomic_float_nanmaxr   r   r   r   r   Śdeclare_atomic_nanmax_float32m   s
    
’r/   c                 C   s4   d}t  t  ” t  t  ” ”t  ” f”}t | ||”S )NZ___numba_atomic_double_nanmaxr"   r   r   r   r   Śdeclare_atomic_nanmax_float64t   s
    
’r0   c                 C   s4   d}t  t  ” t  t  ” ”t  ” f”}t | ||”S )NZ___numba_atomic_float_nanminr   r   r   r   r   Śdeclare_atomic_nanmin_float32{   s
    
’r1   c                 C   s4   d}t  t  ” t  t  ” ”t  ” f”}t | ||”S )NZ___numba_atomic_double_nanminr"   r   r   r   r   Śdeclare_atomic_nanmin_float64   s
    
’r2   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
    
’r4   c                 C   s4   d}t  t  d”t  d”t  d”f”}t | ||”S )NZcudaCGSynchronizer$   r'   r3   r   r   r   r   Śdeclare_cudaCGSynchronize   s
    ’r5   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    
’rB   c                 C   s8   t  t  d””}t  t  d”||g”}t | |d”}|S )Nr9   r$   Śvprintf)r   r
   r	   r   r   r   )r   Z	voidptrtyZ	vprintftyrC   r   r   r   Śdeclare_vprint£   s    rD   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   r8   r;   r   Śfnr   r   r   Ś	call_sregÄ   s    rH   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©rH   r   ©rK   Śxyzr   r   r   ŚtidĻ   s    zSRegBuilder.tidc                 C   s   t | jd| S )Nzctaid.%srM   rN   r   r   r   ŚctaidŅ   s    zSRegBuilder.ctaidc                 C   s   t | jd| S )Nzntid.%srM   rN   r   r   r   ŚntidÕ   s    zSRegBuilder.ntidc                 C   s   t | jd| S )Nz	nctaid.%srM   rN   r   r   r   ŚnctaidŲ   s    zSRegBuilder.nctaidc                 C   s:   |   |”}|  |”}|  |”}| j | j ||”|”}|S rJ   )rP   rR   rQ   r   ŚaddŚmul)rK   rO   rP   rR   rS   Śresr   r   r   ŚgetdimŪ   s
    


zSRegBuilder.getdimN)	Ś__name__Ś
__module__Ś__qualname__rL   rP   rQ   rR   rS   rW   r   r   r   r   rI   Ė   s   rI   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 rJ   )rW   )Ś.0rO   ©Zsregr   r   Ś	<genexpr>å   s     z get_global_id.<locals>.<genexpr>rO   r   r   )rI   ŚlistŚ	itertoolsŚislice)r   ŚdimŚitŚseqr   r\   r   Śget_global_idć   s    rd   )#r_   Zllvmliter   Z
numba.corer   r   Zcudadrvr   r   r   r   r    r!   r#   r&   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r4   r5   rB   rD   rE   rH   ŚobjectrI   rd   r   r   r   r   Ś<module>   sV   	ī