a
    ¿·Dfg   ã                   @   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   úa/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/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   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
    
ÿr0   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
    
ÿr1   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
    
ÿr2   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
    
ÿr3   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
    
ÿr5   c                 C   s4   d}t  t  d¡t  d¡t  d¡f¡}t | ||¡S )NZcudaCGSynchronizer%   r(   r4   r   r   r   r   Údeclare_cudaCGSynchronize   s
    ÿr6   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    
ÿrC   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	vprintftyrD   r   r   r   Údeclare_vprint£   s    rE   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   r9   r<   r   Úfnr   r   r   Ú	call_sregÄ   s    rI   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©rI   r   ©rL   Úxyzr   r   r   ÚtidÏ   s    zSRegBuilder.tidc                 C   s   t | jd| ƒS )Nzctaid.%srN   rO   r   r   r   ÚctaidÒ   s    zSRegBuilder.ctaidc                 C   s   t | jd| ƒS )Nzntid.%srN   rO   r   r   r   ÚntidÕ   s    zSRegBuilder.ntidc                 C   s   t | jd| ƒS )Nz	nctaid.%srN   rO   r   r   r   ÚnctaidØ   s    zSRegBuilder.nctaidc                 C   sb   t  d¡}| j |  |¡|¡}| j |  |¡|¡}| j |  |¡|¡}| j | j ||¡|¡}|S )Nr(   )	r   r	   r   ZsextrQ   rS   rR   ÚaddÚmul)rL   rP   Zi64rQ   rS   rT   Úresr   r   r   ÚgetdimÛ   s    
zSRegBuilder.getdimN)	Ú__name__Ú
__module__Ú__qualname__rM   rQ   rR   rS   rT   rX   r   r   r   r   rJ   Ë   s   rJ   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 rK   )rX   )Ú.0rP   ©Zsregr   r   Ú	<genexpr>æ   ó    z get_global_id.<locals>.<genexpr>rP   r   r   )rJ   ÚlistÚ	itertoolsÚislice)r   ZdimÚitÚseqr   r]   r   Úget_global_idä   s    re   )#ra   Zllvmliter   Z
numba.corer   r   Zcudadrvr   r   r   r   r!   r"   r$   r'   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r5   r6   rC   rE   rF   rI   ÚobjectrJ   re   r   r   r   r   Ú<module>   sV   	î