U
    Ã9%e   ã                   @   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   úS/var/www/html/Darija-Ai-API/env/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   	î