Ë
    üÇ:j+^  ã                   ój  — d Z ddlZddlZddlZddlZddlmZmZmZm	Z	m
Z
mZmZ ddlZddlmZ ddlmZmZmZ ddlmZmZmZ ddlmZmZ  ej6                  e«      ZdZdZd	Z d
Z!dZ"eZ#eZ$djK                  «       Z& e'e&«      D ]  \  Z(Z) e*ejV                  e   e)e(«       Œ dZ,dZ-d„ Z. ej^                  «       Z0 G d„ de1«      Z2 G d„ de1«      Z3dZ4dddddddddddddœZ5d„ Z6d„ Z7d„ Z8d„ Z9dZ: G d„ d e1«      Z;d!Z<d"Z=d#Z>d$Z?d%Z@d&„ ZAd'„ ZBd(„ ZCd)„ ZDd*„ ZEd+„ ZFd,„ ZG ej�                  d-«      ZId.„ ZJd/„ ZKd0„ ZLy)1z(
This is a direct translation of nvvm.h
é    N)Úc_void_pÚc_intÚPOINTERÚc_char_pÚc_size_tÚbyrefÚc_char)Úiré   )Ú	NvvmErrorÚNvvmSupportErrorÚNvvmWarning)Úget_libdeviceÚopen_libdeviceÚopen_cudalib)ÚcgutilsÚconfigé   é   é   a  
NVVM_SUCCESS
NVVM_ERROR_OUT_OF_MEMORY
NVVM_ERROR_PROGRAM_CREATION_FAILURE
NVVM_ERROR_IR_VERSION_MISMATCH
NVVM_ERROR_INVALID_INPUT
NVVM_ERROR_INVALID_PROGRAM
NVVM_ERROR_INVALID_IR
NVVM_ERROR_INVALID_OPTION
NVVM_ERROR_NO_MODULE_IN_PROGRAM
NVVM_ERROR_COMPILATION
z�e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-n16:32:64zŽe-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-i128:128:128-f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-n16:32:64c                  ó8   — 	 t        «        y# t        $ r Y yw xY w)z(
    Return if libNVVM is available
    TF)ÚNVVMr   © ó    úl/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/numba/cuda/cudadrv/nvvm.pyÚis_availabler   <   s%   € ðÜŒð øô ò Ùðús   ‚
 �	˜c                   óV  — e Zd ZdZe ee«       ee«      fe ee«      fe ee«      feeee	efeeee	efeee ee«      fee ee	«      feeefee ee	«      feeefe ee«       ee«       ee«       ee«      feee ee«      fdœZ
dZd„ Zd„ Zed„ «       Zed„ «       Zd„ Zd	„ Zdd
„Zy)r   zProcess-wide singleton.
    )ÚnvvmVersionÚnvvmCreateProgramÚnvvmDestroyProgramÚnvvmAddModuleToProgramÚnvvmLazyAddModuleToProgramÚnvvmCompileProgramÚnvvmGetCompiledResultSizeÚnvvmGetCompiledResultÚnvvmGetProgramLogSizeÚnvvmGetProgramLogÚnvvmIRVersionÚnvvmVerifyProgramNc                 óÚ  — t         5  | j                  €†t        j                  | «      x| _        }	 t	        d«      |_        |j                  j                  «       D ]<  \  }}t        |j
                  |«      }|d   |_        |dd  |_        t        |||«       Œ> d d d «       | j                  S # t        $ r}d | _        d}t        ||z  «      ‚d }~ww xY w# 1 sw Y   | j                  S xY w)NÚnvvmz;libNVVM cannot be found. Do `conda install cudatoolkit`:
%sr   r   )Ú
_nvvm_lockÚ_NVVM__INSTANCEÚobjectÚ__new__r   ÚdriverÚOSErrorr   Ú_PROTOTYPESÚitemsÚgetattrÚrestypeÚargtypesÚsetattr)ÚclsÚinstÚeÚerrmsgÚnameÚprotoÚfuncs          r   r/   zNVVM.__new__†   sä   € Üñ 	.Ø�~‰~Ð%Ü(.¯©°sÓ(;Ð;�” ð7Ü".¨vÓ"6�D”Kð $(×#3Ñ#3×#9Ñ#9Ó#;ò .‘K�D˜%Ü" 4§;¡;°Ó5�DØ#(¨¡8�D”LØ$)¨!¨" I�D”MÜ˜D $¨Õ-ð	.÷	.ð$ �~‰~Ðøô ò 7Ø%)�C”Nð2�Fä*¨6°A©:Ó6Ð6ûð	7ú÷	.ð$ �~‰~Ðús/   ‡)C±B.ÁACÂ.	CÂ7CÃCÃCÃC*c                 ó’   — | j                  «       }|d   | _        |d   | _        |d   | _        |d   | _        t        «       | _        y )Nr   r   é   r   )Úget_ir_versionÚ_majorIRÚ_minorIRÚ	_majorDbgÚ	_minorDbgÚget_supported_ccsÚ_supported_ccs)ÚselfÚir_versionss     r   Ú__init__zNVVM.__init__›   sG   € Ø×)Ñ)Ó+ˆØ# A™ˆŒØ# A™ˆŒØ$ Q™ˆŒØ$ Q™ˆŒÜ/Ó1ˆÕr   c                 óP   — | j                   | j                  fdk  rt        S t        S )N)r   é   )rB   rC   Ú_datalayout_originalÚ_datalayout_i128©rH   s    r   Údata_layoutzNVVM.data_layout£   s#   € à�M‰M˜4Ÿ=™=Ð)¨FÒ2Ü'Ð'ä#Ð#r   c                 ó   — | j                   S ©N)rG   rO   s    r   Úsupported_ccszNVVM.supported_ccsª   s   € à×"Ñ"Ð"r   c                 óÆ   — t        «       }t        «       }| j                  t        |«      t        |«      «      }| j                  |d«       |j                  |j                  fS )NzFailed to get version.)r   r   r   Úcheck_errorÚvalue)rH   ÚmajorÚminorÚerrs       r   Úget_versionzNVVM.get_version®   sN   € Ü“ˆÜ“ˆØ×Ñœu U›|¬U°5«\Ó:ˆØ×Ñ˜Ð6Ô7Ø�{‰{˜EŸK™KÐ'Ð'r   c                 óB  — t        «       }t        «       }t        «       }t        «       }| j                  t        |«      t        |«      t        |«      t        |«      «      }| j                  |d«       |j                  |j                  |j                  |j                  fS )NzFailed to get IR version.)r   r(   r   rU   rV   )rH   ÚmajorIRÚminorIRÚmajorDbgÚminorDbgrY   s         r   rA   zNVVM.get_ir_versionµ   sx   € Ü“'ˆÜ“'ˆÜ“7ˆÜ“7ˆØ× Ñ ¤ w£´°w³Ü!& x£´%¸³/óCˆà×Ñ˜Ð9Ô:Ø�}‰}˜gŸm™m¨X¯^©^¸X¿^¹^ÐKÐKr   c                 óx   — |r8t        |t        |   «      }|r!t        |«       t        j                  d«       y |‚y )Nr   )r   ÚRESULT_CODE_NAMESÚprintÚsysÚexit)rH   ÚerrorÚmsgrd   Úexcs        r   rU   zNVVM.check_error¿   s6   € ÙÜ˜CÔ!2°5Ñ!9Ó:ˆCÙÜ�c”
Ü—‘˜•à�	ð r   )F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Únvvm_resultr   r   Únvvm_programr   r   r2   r-   r/   rJ   ÚpropertyrP   rS   rZ   rA   rU   r   r   r   r   r   K   s<  „ ñð
 $¡W¨U£^±W¸U³^ÐDð *©7°<Ó+@ÐAð  +©G°LÓ,AÐBð
 ˜ x°¸8ð#Eð ˜ x°¸8ð'Eð ˜ u©g°hÓ.?ðAð ˜¡w¨xÓ'8ð&:ð #.¨|¸XÐ!Fð #.¨|¹WÀXÓ=NÐ!Oð *¨<¸ÐBð &¡w¨u£~±w¸u³~Ù! %›.©'°%«.ð:ð *¨<¸Ù% hÓ/ð1ñc3€Kðl €Jòò*2ð ñ$ó ð$ð ñ#ó ð#ò(òLôr   r   c                   ó6   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)	ÚCompilationUnitc                 óÔ   — t        «       | _        t        «       | _        | j                  j	                  t        | j                  «      «      }| j                  j                  |d«       y )NzFailed to create CU)r   r0   rm   Ú_handler   r   rU   )rH   rY   s     r   rJ   zCompilationUnit.__init__Ê   sF   € Ü“fˆŒÜ#“~ˆŒØ�k‰k×+Ñ+¬E°$·,±,Ó,?Ó@ˆØ�‰×Ñ Ð%:Õ;r   c                 óˆ   — t        «       }|j                  t        | j                  «      «      }|j	                  |dd¬«       y )NzFailed to destroy CUT)rd   )r   r    r   rr   rU   )rH   r0   rY   s      r   Ú__del__zCompilationUnit.__del__Ð   s8   € Ü“ˆØ×'Ñ'¬¨d¯l©lÓ(;Ó<ˆØ×Ñ˜3Ð 6¸TÐÕBr   c                 óž   — | j                   j                  | j                  |t        |«      d«      }| j                   j	                  |d«       y)zÔ
         Add a module level NVVM IR to a compilation unit.
         - The buffer should contain an NVVM module IR either in the bitcode
           representation (LLVM3.0) or in the text representation.
        NúFailed to add module)r0   r!   rr   ÚlenrU   ©rH   ÚbufferrY   s      r   Ú
add_modulezCompilationUnit.add_moduleÕ   s?   € ð �k‰k×0Ñ0°·±¸vÜ14°V³¸dóDˆà�‰×Ñ Ð%;Õ<r   c                 óž   — | j                   j                  | j                  |t        |«      d«      }| j                   j	                  |d«       y)zÂ
        Lazily add an NVVM IR module to a compilation unit.
        The buffer should contain NVVM module IR either in the bitcode
        representation or in the text representation.
        Nrv   )r0   r"   rr   rw   rU   rx   s      r   Úlazy_add_modulezCompilationUnit.lazy_add_moduleß   s?   € ð �k‰k×4Ñ4°T·\±\À6Ü58¸³[À$óHˆà�‰×Ñ Ð%;Õ<r   c           
      ó¶  — d„ }|j                  «       D ��cg c]  \  }} |||«      ‘Œ }}}t        t        |«      z  |D �cg c]  }t        |j                  d«      «      ‘Œ c}Ž }| j                  j                  | j                  t        |«      |«      }| j                  |d«       | j                  j                  | j                  t        |«      |«      }| j                  |d«       t        «       }| j                  j                  | j                  t        |«      «      }| j                  |d«       t        |j                  z  «       }	| j                  j                  | j                  |	«      }| j                  |d«       | j                  «       | _        | j                   r%t#        j$                  | j                   t&        ¬«       |	dd S c c}}w c c}w )	a  Perform Compilation.

        Compilation options are accepted as keyword arguments, with the
        following considerations:

        - Underscores (`_`) in option names are converted to dashes (`-`), to
          match NVVM's option name format.
        - Options that take a value will be emitted in the form
          "-<name>=<value>".
        - Booleans passed as option values will be converted to integers.
        - Options which take no value (such as `-gen-lto`) should have a value
          of `None` passed in and will be emitted in the form "-<name>".

        For documentation on NVVM compilation options, see the CUDA Toolkit
        Documentation:

        https://docs.nvidia.com/cuda/libnvvm-api/index.html#_CPPv418nvvmCompileProgram11nvvmProgramiPPKc
        c                 óz   — | j                  dd«      } |€d| › �S t        |t        «      rt        |«      }d| › d|› �S )NÚ_ú-ú=)ÚreplaceÚ
isinstanceÚboolÚint)ÚkÚvs     r   Ústringify_optionz1CompilationUnit.compile.<locals>.stringify_optioný   sG   € Ø—	‘	˜#˜sÓ#ˆAàˆyØ˜1˜#�w�ä˜!œTÔ"Ü˜“F�à�q�c˜˜1˜#�;Ðr   Úutf8zFailed to verify
zFailed to compile
z&Failed to get size of compiled result.zFailed to get compiled result.)ÚcategoryN)r3   r   rw   Úencoder0   r)   rr   Ú
_try_errorr#   r   r$   r   r	   rV   r%   Úget_logÚlogÚwarningsÚwarnr   )
rH   Úoptionsrˆ   r†   r‡   ÚxÚc_optsrY   ÚreslenÚoutput_buffers
             r   ÚcompilezCompilationUnit.compileé   sv  € ò(		ð 7>·m±m³o×F©d¨a°Ñ# A qÕ)ÐFˆÑFäœS ›\Ñ)Ø6=ö-?Ø12ô .6°a·h±h¸vÓ6FÕ-Gò -?ð @ˆð �k‰k×+Ñ+¨D¯L©L¼#¸g»,ÈÓOˆØ�‰˜Ð1Ô2ð �k‰k×,Ñ,¨T¯\©\¼3¸w»<ÈÓPˆØ�‰˜Ð2Ô3ô “ˆØ�k‰k×3Ñ3°D·L±LÄ%ÈÃ-ÓPˆà�‰˜ÐEÔFä &§,¡,Ñ.Ó1ˆØ�k‰k×/Ñ/°·±¸mÓLˆØ�‰˜Ð=Ô>ð —<‘<“>ˆŒØ�8Š8Ü�M‰M˜$Ÿ(™(¬[Õ9à™QÐÐùó7 Gùò-?s   —GÁ!Gc                 ób   — | j                   j                  ||›d| j                  «       ›�«       y )Nú
)r0   rU   r�   )rH   rY   rf   s      r   rŒ   zCompilationUnit._try_error%  s!   € Ø�‰×Ñ ²°d·l±l´nÐ%EÕFr   c                 ó´  — t        «       }| j                  j                  | j                  t	        |«      «      }| j                  j                  |d«       |j                  dkD  rtt        |j                  z  «       }| j                  j                  | j                  |«      }| j                  j                  |d«       |j                  j                  d«      S y)Nz#Failed to get compilation log size.r   zFailed to get compilation log.r‰   Ú )
r   r0   r&   rr   r   rU   rV   r	   r'   Údecode)rH   r”   rY   Úlogbufs       r   r�   zCompilationUnit.get_log(  s    € Ü“ˆØ�k‰k×/Ñ/°·±¼eÀF»mÓLˆØ�‰×Ñ Ð%JÔKà�<‰<˜!ÒÜ˜vŸ|™|Ñ+Ó.ˆFØ—+‘+×/Ñ/°·±¸fÓEˆCØ�K‰K×#Ñ# CÐ)IÔJà—<‘<×&Ñ& vÓ.Ð.àr   N)
rh   ri   rj   rJ   rt   rz   r|   r–   rŒ   r�   r   r   r   rp   rp   É   s(   „ ò<òCò
=ò=ò: òxGór   rp   )©r   r   )r   é   ©r   r   )r   r@   )r   r   )é   r   )r    r   )r    r@   )rž   r   )rž   r@   )rž   r   )rL   r   ©rL   r    ©rL   rž   )rL   é	   ©r£   r   )r�   r¡   )r�   r¢   )r�   r¤   )rŸ   r¤   ))é   r@   )r¥   r   )r¥   r   )r¥   r   )r¥   r    )r¥   rž   )r¥   rL   )é   r   )r¦   r   )r¦   r@   )r¦   r   )r¦   r   c                 ó  — 	 t         |    \  }}t        t        D �cg c]  }||cxk  r|k  rn n|‘Œ c}«      S c c}w # t        $ r9 t        t        D �cg c]  }|t        j
                  k\  r|‘Œ nc c}w c}«      cY S w xY wrR   )ÚCTK_SUPPORTEDÚtupleÚCOMPUTE_CAPABILITIESÚKeyErrorr   ÚCUDA_DEFAULT_PTX_CC)Úctk_versionÚmin_ccÚmax_ccÚccs       r   Úccs_supported_by_ctkr±   Q  s�   € ð	<ä& {Ñ3‰ˆ�ÜÔ#7ö 1˜RØ 2Ô/¨Õ/ò ò 1ó 2ð 	2ùò 1øäò <ô Ô#7ö ;˜RØœv×9Ñ9Ò9ò ñ ;ùô ;ó <ò 	<ð<ús'   ‚> ›9²> ¹> ¾B ÁA1
Á0B Á?B c                  óø   — 	 ddl m}  | j                  «       }t        t        «      }||k  r8d}|d   › d|d   › �}d|› d|d   › d|d   › d�}t        j                  |«       |S t        |«      }|S #  d}|cY S xY w)	Nr   )Úruntimer   ú.r   zCUDA Toolkit z is unsupported by Numba - z! is the minimum required version.)Únumba.cuda.cudadrv.runtimer³   rZ   Úminr¨   r�   r�   r±   )r³   Úcudart_versionÚ_supported_ccÚ
min_cudartÚctk_verÚunsupported_vers         r   rF   rF   ^  s®   € ðÝ6Ø ×,Ñ,Ó.ˆô ”]Ó#€JØ˜
Ò"ØˆØ# AÑ&Ð' q¨¸Ñ):Ð(;Ð<ˆØ*¨7¨)Ð3NØ(¨™m˜_¨A¨j¸©m¨_ð =/ð/ˆô 	�‰�oÔ&ØÐä(¨Ó8€MØÐøð%ð ˆØÒús   ‚A1 Á1A9c                 óØ   — t        «       j                  }|sd}t        |«      ‚t        |«      D ]5  \  }}|| k(  r|c S || kD  sŒ|dk(  rd| |z   z  }t        |«      ‚||dz
     c S  |d   S )zñ
    Given a compute capability, return the closest compute capability supported
    by the CUDA toolkit.

    :param mycc: Compute capability as a tuple ``(MAJOR, MINOR)``
    :return: Closest supported CC as a tuple ``(MAJOR, MINOR)``
    zmNo supported GPU compute capabilities found. Please check your cudatoolkit version matches your CUDA version.r   z?GPU compute capability %d.%d is not supported(requires >=%d.%d)r   éÿÿÿÿ)r   rS   r   Ú	enumerate)ÚmyccrS   rf   Úir°   s        r   Úfind_closest_archrÁ   w  s•   € ô “F×(Ñ(€MáðQˆä˜sÓ#Ð#ä˜=Ó)ò ,‰ˆˆ2Ø�Š:àŠIØ�$‹Yà�AŠvð+Ø.2°R©iñ9�ä& sÓ+Ð+ð % Q¨¡UÑ+Ò+ð,ð  ˜ÑÐr   c                 óp   — t         j                  rt         j                  }d|z  S t        | |f«      }d|z  S )z1Matches with the closest architecture option
    zcompute_%d%d)r   ÚFORCE_CUDA_CCrÁ   )rW   rX   Úarchs      r   Úget_arch_optionrÅ   ™  s@   € ô ×ÒÜ×#Ñ#ˆð ˜DÑ Ð ô ! %¨ Ó0ˆØ˜DÑ Ð r   aN  Missing libdevice file.
Please ensure you have a CUDA Toolkit 11.2 or higher.
For CUDA 12, ``cuda-nvcc`` and ``cuda-nvrtc`` are required:

    $ conda install -c conda-forge cuda-nvcc cuda-nvrtc "cuda-version>=12.0"

For CUDA 11, ``cudatoolkit`` is required:

    $ conda install -c conda-forge cudatoolkit "cuda-version>=11.2,<12.0"
c                   ó   — e Zd ZdZd„ Zd„ Zy)Ú	LibDeviceNc                 óŽ   — | j                   €(t        «       €t        t        «      ‚t	        «       | _         | j                   | _        y rR   )Ú_cache_r   ÚRuntimeErrorÚMISSING_LIBDEVICE_FILE_MSGr   ÚbcrO   s    r   rJ   zLibDevice.__init__²  s5   € Ø�<‰<ÐÜ‹Ð&Ü"Ô#=Ó>Ð>Ü)Ó+ˆDŒLà—,‘,ˆ�r   c                 ó   — | j                   S rR   )rÌ   rO   s    r   ÚgetzLibDevice.getº  s   € Ø�w‰wˆr   )rh   ri   rj   rÉ   rJ   rÎ   r   r   r   rÇ   rÇ   ¯  s   „ Ø€Gòór   rÇ   z’
    %cas_success = cmpxchg volatile {Ti}* %iptr, {Ti} %old, {Ti} %new monotonic monotonic
    %cas = extractvalue {{ {Ti}, i1 }} %cas_success, 0
a  
define internal {T} @___numba_atomic_{T}_{FUNC}({T}* %ptr, {T} %val) alwaysinline {{
entry:
    %iptr = bitcast {T}* %ptr to {Ti}*
    %old2 = load volatile {Ti}, {Ti}* %iptr
    br label %attempt

attempt:
    %old = phi {Ti} [ %old2, %entry ], [ %cas, %attempt ]
    %dold = bitcast {Ti} %old to {T}
    %dnew = {OP} {T} %dold, %val
    %new = bitcast {T} %dnew to {Ti}
    {CAS}
    %repeat = icmp ne {Ti} %cas, %old
    br i1 %repeat, label %attempt, label %done

done:
    %result = bitcast {Ti} %old to {T}
    ret {T} %result
}}
aÇ  
define internal {T} @___numba_atomic_{Tu}_inc({T}* %iptr, {T} %val) alwaysinline {{
entry:
    %old2 = load volatile {T}, {T}* %iptr
    br label %attempt

attempt:
    %old = phi {T} [ %old2, %entry ], [ %cas, %attempt ]
    %bndchk = icmp ult {T} %old, %val
    %inc = add {T} %old, 1
    %new = select i1 %bndchk, {T} %inc, {T} 0
    {CAS}
    %repeat = icmp ne {T} %cas, %old
    br i1 %repeat, label %attempt, label %done

done:
    ret {T} %old
}}
aË  
define internal {T} @___numba_atomic_{Tu}_dec({T}* %iptr, {T} %val) alwaysinline {{
entry:
    %old2 = load volatile {T}, {T}* %iptr
    br label %attempt

attempt:
    %old = phi {T} [ %old2, %entry ], [ %cas, %attempt ]
    %dec = add {T} %old, -1
    %bndchk = icmp ult {T} %dec, %val
    %new = select i1 %bndchk, {T} %dec, {T} %val
    {CAS}
    %repeat = icmp ne {T} %cas, %old
    br i1 %repeat, label %attempt, label %done

done:
    ret {T} %old
}}
a”  
define internal {T} @___numba_atomic_{T}_{NAN}{FUNC}({T}* %ptr, {T} %val) alwaysinline {{
entry:
    %ptrval = load volatile {T}, {T}* %ptr
    ; Return early when:
    ; - For nanmin / nanmax when val is a NaN
    ; - For min / max when val or ptr is a NaN
    %early_return = fcmp uno {T} %val, %{PTR_OR_VAL}val
    br i1 %early_return, label %done, label %lt_check

lt_check:
    %dold = phi {T} [ %ptrval, %entry ], [ %dcas, %attempt ]
    ; Continue attempts if dold less or greater than val (depending on whether min or max)
    ; or if dold is NaN (for nanmin / nanmax)
    %cmp = fcmp {OP} {T} %dold, %val
    br i1 %cmp, label %attempt, label %done

attempt:
    ; Attempt to swap in the value
    %old = bitcast {T} %dold to {Ti}
    %iptr = bitcast {T}* %ptr to {Ti}*
    %new = bitcast {T} %val to {Ti}
    {CAS}
    %dcas = bitcast {Ti} %cas to {T}
    br label %lt_check

done:
    ret {T} %ptrval
}}
c                 ó.   — t         j                  | ¬«      S )N©ÚTi)Úcas_nvvmÚformatrÐ   s    r   Úir_casrÔ   #  s   € Ü�?‰?˜bˆ?Ó!Ð!r   c           	      ó^   — t        | |||t        |«      ¬«      }t        j                  di |¤ŽS )N)ÚTrÑ   ÚOPÚFUNCÚCASr   )ÚdictrÔ   Úir_numba_atomic_binary_templaterÓ   )rÖ   rÑ   r×   rØ   Úparamss        r   Úir_numba_atomic_binaryrÝ   '  s,   € Ü�A˜" ¨$´F¸2³JÔ?€FÜ*×1Ñ1Ñ;°FÑ;Ð;r   c                 ób   — t        | |||||t        |«      ¬«      }t        j                  di |¤ŽS )N)rÖ   rÑ   ÚNANr×   Ú
PTR_OR_VALrØ   rÙ   r   )rÚ   rÔ   Úir_numba_atomic_minmax_templaterÓ   )rÖ   rÑ   rß   r×   rà   rØ   rÜ   s          r   Úir_numba_atomic_minmaxrâ   ,  s5   € Ü�A˜" #¨"¸Ø¤¨£ô-€Fô +×1Ñ1Ñ;°FÑ;Ð;r   c                 óD   — t         j                  | |t        | «      ¬«      S ©N)rÖ   ÚTurÙ   )Úir_numba_atomic_inc_templaterÓ   rÔ   ©rÖ   rå   s     r   Úir_numba_atomic_incrè   3  ó   € Ü'×.Ñ.°°r¼vÀa»yÐ.ÓIÐIr   c                 óD   — t         j                  | |t        | «      ¬«      S rä   )Úir_numba_atomic_dec_templaterÓ   rÔ   rç   s     r   Úir_numba_atomic_decrì   7  ré   r   c                 ó  — dt        dddd¬«      fdt        dd	d
d¬«      fdt        ddd
d¬«      fdt        dd¬«      fdt        dd¬«      fdt        dd	dddd¬«      fdt        dddddd¬«      fdt        dd	dddd¬«      fdt        dddddd¬«      fdt        dd	dddd¬«      fdt        dddddd¬«      fd t        dd	dd!dd¬«      fd"t        dddd!dd¬«      fd#g}|D ]  \  }}| j	                  ||«      } Œ t        | «      } | S )$NzIdeclare double @"___numba_atomic_double_add"(double* %".1", double %".2")ÚdoubleÚi64ÚfaddÚadd)rÖ   rÑ   r×   rØ   zEdeclare float @"___numba_atomic_float_sub"(float* %".1", float %".2")ÚfloatÚi32ÚfsubÚsubzIdeclare double @"___numba_atomic_double_sub"(double* %".1", double %".2")z=declare i64 @"___numba_atomic_u64_inc"(i64* %".1", i64 %".2")Úu64rç   z=declare i64 @"___numba_atomic_u64_dec"(i64* %".1", i64 %".2")zEdeclare float @"___numba_atomic_float_max"(float* %".1", float %".2")rš   znnan oltÚptrÚmax)rÖ   rÑ   rß   r×   rà   rØ   zIdeclare double @"___numba_atomic_double_max"(double* %".1", double %".2")zEdeclare float @"___numba_atomic_float_min"(float* %".1", float %".2")znnan ogtr¶   zIdeclare double @"___numba_atomic_double_min"(double* %".1", double %".2")zHdeclare float @"___numba_atomic_float_nanmax"(float* %".1", float %".2")ÚnanÚultzLdeclare double @"___numba_atomic_double_nanmax"(double* %".1", double %".2")zHdeclare float @"___numba_atomic_float_nanmin"(float* %".1", float %".2")ÚugtzLdeclare double @"___numba_atomic_double_nanmin"(double* %".1", double %".2"))Úimmargrš   )rÝ   rè   rì   râ   r‚   Úllvm140_to_70_ir)ÚllvmirÚreplacementsÚdeclÚfns       r   Úllvm_replacer  ;  s¬  € à	TÜ	 (¨u¸ÀeÔ	Lð	Nà	PÜ	 '¨e¸ÀUÔ	Kð	Mà	TÜ	 (¨u¸ÀeÔ	Lð	Nà	HÜ	˜u¨Ô	/ð	1à	HÜ	˜u¨Ô	/ð	1à	PÜ	 '¨e¸À
Ø+0°uô
>ð	?ð 
UÜ	 (¨u¸"ÀØ+0°uô
>ð	?ð 
QÜ	 '¨e¸À
Ø+0°uô
>ð	?ð 
UÜ	 (¨u¸"ÀØ+0°uô
>ð	?ð 
TÜ	 '¨e¸À5Ø+-°Eô
;ð	<ð 
XÜ	 (¨u¸%ÀEØ+-°Eô
;ð	<ð 
TÜ	 '¨e¸À5Ø+-°Eô
;ð	<ð 
XÜ	 (¨u¸%ÀEØ+-°Eô
;ð	<ð 	ðG$€LðL !ò *‰ˆˆbØ—‘  bÓ)‰ð*ô ˜fÓ%€Fà€Mr   c                 óf  — t        | t        «      r| g} |j                  dd«      r|j                  dddddœ«       t	        «       }t        «       }| D ]-  }t        |«      }|j                  |j                  d«      «       Œ/ |j                  |j                  «       «        |j                  di |¤ŽS )NÚfastmathFT)ÚftzÚfmaÚprec_divÚ	prec_sqrtr‰   r   )rƒ   ÚstrÚpopÚupdaterp   rÇ   r  rz   r‹   r|   rÎ   r–   )rþ   ÚoptsÚcuÚ	libdeviceÚmods        r   Ú
compile_irr  j  s§   € Ü�&œ#ÔØ�ˆà‡x�x�
˜EÔ"Ø�‰ØØØØñ	
ô 	ô 
Ó	€BÜ“€Iàò *ˆÜ˜3ÓˆØ
�‰�c—j‘j Ó(Õ)ð*ð ×Ñ�y—}‘}“Ô'àˆ2�:‰:Ñ˜ÑÐr   z"^attributes #\d+ = \{ ([\w\s]+)\ }c                 ór  — g } | j                   «       D ]‘  }|j                  d«      rmt        j                  |«      }|j	                  d«      j                  «       }dj                  d„ |D «       «      }|j                  |j	                  d«      |«      }|j                  |«       Œ“ dj                  |«      S )z,
    Convert LLVM 14.0 IR for LLVM 7.0.
    zattributes #r   ú c              3   ó,   K  — | ]  }|d k7  sŒ	|–— Œ y­w)Ú
willreturnNr   )Ú.0Úas     r   ú	<genexpr>z#llvm140_to_70_ir.<locals>.<genexpr>Ž  s   è ø€ ÒC 1°°lÓ1BœQÑCùs   ‚
�r˜   )	Ú
splitlinesÚ
startswithÚre_attributes_defÚmatchÚgroupÚsplitÚjoinr‚   Úappend)r
   ÚbufÚlineÚmÚattrss        r   rý   rý   „  sš   € ð €CØ�—‘“ò ˆØ�?‰?˜>Ô*ä!×'Ñ'¨Ó-ˆAØ—G‘G˜A“J×$Ñ$Ó&ˆEØ—H‘HÑC¨ÔCÓCˆEØ—<‘< §¡¨£
¨EÓ2ˆDà�
‰
�4Õðð �9‰9�S‹>Ðr   c                 ó\  — | j                   }t        j                  |d«      }t        j                  t        j                  d«      d«      }|j                  | ||f«      }t        j                  |d«      }|j                  |«       t        j                  d«      j                  «       }t        j                  |d«      }| j                  |«      }t        j                  ||d«      }	d|	_        d|	_        t        j                  ||g«      |	_        | j                   j#                  d	«       y
)al  
    Mark a function as a CUDA kernel. Kernels have the following requirements:

    - Metadata that marks them as a kernel.
    - Addition to the @llvm.used list, so that they will not be discarded.
    - The noinline attribute is not permitted, because this causes NVVM to emit
      a warning, which counts as failing IR verification.

    Presently it is assumed that there is one kernel per module, which holds
    for Numba-jitted functions. If this changes in future or this function is
    to be used externally, this function may need modification to add to the
    @llvm.used list rather than creating it.
    Úkernelé    r   znvvm.annotationsrL   z	llvm.usedÚ	appendingzllvm.metadataÚnoinlineN)Úmoduler
   ÚMetaDataStringÚConstantÚIntTypeÚadd_metadatar   Úget_or_insert_named_metadatarñ   Ú
as_pointerÚ	ArrayTypeÚbitcastÚGlobalVariableÚlinkageÚsectionÚinitializerÚ
attributesÚdiscard)
Úfunctionr)  ÚmdstrÚmdvalueÚmdÚnmdÚptrtyÚusedtyÚfnptrÚ	llvm_useds
             r   Úset_cuda_kernelrA  –  sõ   € ð �_‰_€Fô ×Ñ˜f hÓ/€EÜ�k‰kœ"Ÿ*™* R›.¨!Ó,€GØ	×	Ñ	˜h¨¨wÐ7Ó	8€Bä
×
.Ñ
.¨vÐ7IÓ
J€CØ‡G�GˆB„Kô �J‰J�q‹M×$Ñ$Ó&€EÜ�\‰\˜% Ó#€Fà×Ñ˜UÓ#€Eä×!Ñ! &¨&°+Ó>€IØ#€IÔØ'€IÔÜŸK™K¨°°Ó8€IÔð ×Ñ×Ñ 
Õ+r   c                 óÔ   — t        j                  d«      }t        «       j                  «       D �cg c]
  } ||«      ‘Œ }}| j	                  |«      }| j                  d|«       yc c}w )zAdd NVVM IR version to moduler&  znvvmir.versionN)r
   r,  r   rA   r-  Úadd_named_metadata)r  ró   r‡   rI   Úmd_vers        r   Úadd_ir_versionrE  ½  sY   € ô �*‰*�R‹.€CÜ#'£6×#8Ñ#8Ó#:Ö;˜a‘3�q•6Ð;€KÐ;Ø×Ñ˜kÓ*€FØ×ÑÐ+¨VÕ4ùò <s   °A%)Mrk   ÚloggingÚrerc   r�   Úctypesr   r   r   r   r   r   r	   Ú	threadingÚllvmliter
   re   r   r   r   Úlibsr   r   r   Ú
numba.corer   r   Ú	getLoggerrh   ÚloggerÚADDRSPACE_GENERICÚADDRSPACE_GLOBALÚADDRSPACE_SHAREDÚADDRSPACE_CONSTANTÚADDRSPACE_LOCALrm   rl   r  ra   r¾   rÀ   r†   r7   ÚmodulesrM   rN   r   ÚLockr,   r.   r   rp   rª   r¨   r±   rF   rÁ   rÅ   rË   rÇ   rÒ   rÛ   ræ   rë   rá   rÔ   rÝ   râ   rè   rì   r  r  r–   r  rý   rA  rE  r   r   r   ú<module>rV     sÓ  ðñó Û 	Û 
Û ÷÷ ñ ó å ç ;Ñ ;ß =Ñ =ß &ð 
ˆ×	Ñ	˜8Ó	$€àÐ ØÐ ØÐ ØÐ Ø€ð €ð €ð÷ 
�EƒGð ñ Ð'Ó(ò )�D€A€qÙˆC�K‰K˜Ñ! 1 aÕ(ð)ð
;Ð ð7Ð ò
	ð ˆY�^‰^Ó€
ô{ˆ6ô {ô|k�fô kð\Ð ð ØØØØØØØØØØØñ€ò 
<òò2òD!ð	Ð ô�ô ð€ð#Ð ð, Ð ð( Ð ð(#Ð ò@"ò<ò
<òJòJò,ò^ð. �B—J‘JÐDÓEÐ òò$$,óN5r   