ó
    „ñ:i+^  ã                   ón  • S r SSKrSSKrSSKrSSKrSSKJrJrJrJ	r	J
r
JrJr  SSKrSSKJr  SSKJrJrJr  SSKJrJrJr  SSKJrJr  \R6                  " \5      rSrSrS	r S
r!Sr"\r#\r$SRK                  5       r&\'" \&5       H  u  r(r)\*" \RV                  \   \)\(5        M     Sr,Sr-S r.\R^                  " 5       r0 " S S\15      r2 " S S\15      r3Sr4SSSSSSSSSSSSS.r5S r6S r7S r8S r9Sr: " S S \15      r;S!r<S"r=S#r>S$r?S%r@S& rAS' rBS( rCS) rDS* rES+ rFS, rG\R�                  " S-5      rIS. rJS/ rKS0 rLg)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                  ó:   •  [        5         g! [         a     gf = f)z 
Return if libNVVM is available
TF)ÚNVVMr   © ó    ÚZ/srv/projetos/modelo_ml_acdoc/venv/lib/python3.13/site-packages/numba/cuda/cudadrv/nvvm.pyÚis_availabler   <   s%   € ðÜŒð øô ó Ùðús   ‚
 �
™c                   ó`  • \ rS rSrSr\\" \5      \" \5      4\\" \5      4\\" \5      4\\\	\
\	4\\\	\
\	4\\\\" \	5      4\\\" \
5      4\\\	4\\\" \
5      4\\\	4\\" \5      \" \5      \" \5      \" \5      4\\\\" \	5      4S.rSrS rS r\S 5       r\S 5       rS	 rS
 rSS jrSrg)r   éK   zProcess-wide singleton.
    )ÚnvvmVersionÚnvvmCreateProgramÚnvvmDestroyProgramÚnvvmAddModuleToProgramÚnvvmLazyAddModuleToProgramÚnvvmCompileProgramÚnvvmGetCompiledResultSizeÚnvvmGetCompiledResultÚnvvmGetProgramLogSizeÚnvvmGetProgramLogÚnvvmIRVersionÚnvvmVerifyProgramNc                 óæ  • [            U R                  c†  [        R                  U 5      =U l        n [	        S5      Ul        UR                  R                  5        H;  u  pE[        UR
                  U5      nUS   Ul        USS  Ul        [        XU5        M=     S S S 5        U R                  $ ! [         a  nS U l        Sn[        X2-  5      eS nAff = f! , (       d  f       U R                  $ = f)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   r0   Ú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©:Ó6Ð6ûð	7ú÷ ŒZð$ �~‰~Ðús/   ‡*C²B/ÁACÂ/
CÂ9CÃCÃCÃ
C0c                 ó’   • U R                  5       nUS   U l        US   U l        US   U l        US   U l        [        5       U l        g )Nr   r   é   r   )Úget_ir_versionÚ_majorIRÚ_minorIRÚ	_majorDbgÚ	_minorDbgÚget_supported_ccsÚ_supported_ccs)ÚselfÚir_versionss     r   Ú__init__ÚNVVM.__init__›   sG   € Ø×)Ñ)Ó+ˆØ# A™ˆŒØ# A™ˆŒØ$ Q™ˆŒØ$ Q™ˆŒÜ/Ó1ˆÕr   c                 óR   • U R                   U R                  4S:  a  [        $ [        $ )N)r   é   )rD   rE   Ú_datalayout_originalÚ_datalayout_i128©rJ   s    r   Údata_layoutÚNVVM.data_layout£   s#   € à�M‰M˜4Ÿ=™=Ð)¨FÓ2Ü'Ð'ä#Ð#r   c                 ó   • U R                   $ ©N)rI   rR   s    r   Úsupported_ccsÚNVVM.supported_ccsª   s   € à×"Ñ"Ð"r   c                 óÆ   • [        5       n[        5       nU R                  [        U5      [        U5      5      nU R                  US5        UR                  UR                  4$ )NzFailed to get version.)r   r   r   Úcheck_errorÚvalue)rJ   ÚmajorÚminorÚerrs       r   Úget_versionÚNVVM.get_version®   sN   € Ü“ˆÜ“ˆØ×Ñœu U›|¬U°5«\Ó:ˆØ×Ñ˜Ð6Ô7Ø�{‰{˜EŸK™KÐ'Ð'r   c                 óB  • [        5       n[        5       n[        5       n[        5       nU R                  [        U5      [        U5      [        U5      [        U5      5      nU R                  US5        UR                  UR                  UR                  UR                  4$ )NzFailed to get IR version.)r   r)   r   rZ   r[   )rJ   ÚmajorIRÚminorIRÚmajorDbgÚminorDbgr^   s         r   rC   ÚNVVM.get_ir_versionµ   sx   € Ü“'ˆÜ“'ˆÜ“7ˆÜ“7ˆØ× Ñ ¤ w£´°w³Ü!& x£´%¸³/óCˆà×Ñ˜Ð9Ô:Ø�}‰}˜gŸm™m¨X¯^©^¸X¿^¹^ÐKÐKr   c                 óŽ   • U(       a>  [        U[        U   5      nU(       a"  [        U5        [        R                  " S5        g Ueg )Nr   )r   ÚRESULT_CODE_NAMESÚprintÚsysÚexit)rJ   ÚerrorÚmsgrk   Úexcs        r   rZ   ÚNVVM.check_error¿   s6   € ÞÜ˜CÔ!2°5Ñ!9Ó:ˆCÞÜ�c”
Ü—’˜•à�	ð r   )rF   rD   rG   rE   rI   )F)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Únvvm_resultr   r   Únvvm_programr   r   r3   r.   r0   rL   ÚpropertyrS   rW   r_   rC   rZ   Ú__static_attributes__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                   ó>   • \ rS rSrS rS rS rS rS rS r	S r
S	rg
)ÚCompilationUnitéÉ   c                 óÔ   • [        5       U l        [        5       U l        U R                  R	                  [        U R                  5      5      nU R                  R                  US5        g )NzFailed to create CU)r   r1   rv   Ú_handler    r   rZ   )rJ   r^   s     r   rL   ÚCompilationUnit.__init__Ê   sF   € Ü“fˆŒÜ#“~ˆŒØ�k‰k×+Ñ+¬E°$·,±,Ó,?Ó@ˆØ�‰×Ñ Ð%:Õ;r   c                 ó‚   • [        5       nUR                  [        U R                  5      5      nUR	                  USSS9  g )NzFailed to destroy CUT)rk   )r   r!   r   r}   rZ   )rJ   r1   r^   s      r   Ú__del__ÚCompilationUnit.__del__Ð   s8   € Ü“ˆØ×'Ñ'¬¨d¯l©lÓ(;Ó<ˆØ×Ñ˜3Ð 6¸TÐÒBr   c                 óž   • U R                   R                  U R                  U[        U5      S5      nU R                   R	                  US5        g)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)r1   r"   r}   ÚlenrZ   ©rJ   Úbufferr^   s      r   Ú
add_moduleÚCompilationUnit.add_moduleÕ   s?   € ð �k‰k×0Ñ0°·±¸vÜ14°V³¸dóDˆà�‰×Ñ Ð%;Õ<r   c                 óž   • U R                   R                  U R                  U[        U5      S5      nU R                   R	                  US5        g)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.
Nrƒ   )r1   r#   r}   r„   rZ   r…   s      r   Úlazy_add_moduleÚCompilationUnit.lazy_add_moduleß   s?   € ð �k‰k×4Ñ4°T·\±\À6Ü58¸³[À$óHˆà�‰×Ñ Ð%;Õ<r   c           
      óÈ  • S nUR                  5        VVs/ s H  u  p4U" X45      PM     nnn[        [        U5      -  " U Vs/ s H  n[        UR                  S5      5      PM     sn6 nU R                  R                  U R                  [        U5      U5      nU R                  US5        U R                  R                  U R                  [        U5      U5      nU R                  US5        [        5       nU R                  R                  U R                  [        U5      5      nU R                  US5        [        UR                  -  " 5       n	U R                  R                  U R                  U	5      nU R                  US5        U R                  5       U l        U R                   (       a#  ["        R$                  " U R                   [&        S9  U	SS $ s  snnf s  snf )	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                 ó†   • U R                  SS5      n Uc  SU  3$ [        U[        5      (       a  [        U5      nSU  SU 3$ )NÚ_Ú-Ú=)ÚreplaceÚ
isinstanceÚboolÚint)ÚkÚvs     r   Ústringify_optionÚ1CompilationUnit.compile.<locals>.stringify_optioný   sJ   € Ø—	‘	˜#˜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)r4   r   r„   Úencoder1   r*   r}   Ú
_try_errorr$   r   r%   r   r	   r[   r&   Úget_logÚlogÚwarningsÚwarnr   )
rJ   Úoptionsr—   r•   r–   ÚxÚc_optsr^   ÚreslenÚoutput_buffers
             r   ÚcompileÚCompilationUnit.compileé   sx  € ò(		ð 7>·m±m´oÔF²o©d¨aÑ# AÖ)±oˆÑFäœS ›\Ò)Ù6=ó-?Ú6=°ô .6°a·h±h¸vÓ6FÖ-GÙ6=ñ-?ð @ˆð �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                 ód   • U R                   R                  X< SU R                  5       < 35        g )NÚ
)r1   rZ   r�   )rJ   r^   rm   s      r   rœ   ÚCompilationUnit._try_error%  s!   € Ø�‰×Ñ ²°d·l±lµnÐ%EÕFr   c                 ó¸  • [        5       nU R                  R                  U R                  [	        U5      5      nU R                  R                  US5        UR                  S:”  au  [        UR                  -  " 5       nU R                  R                  U R                  U5      nU R                  R                  US5        UR                  R                  S5      $ g)Nz#Failed to get compilation log size.r   zFailed to get compilation log.r™   Ú )
r   r1   r'   r}   r   rZ   r[   r	   r(   Údecode)rJ   r¤   r^   Úlogbufs       r   r�   ÚCompilationUnit.get_log(  s    € Ü“ˆØ�k‰k×/Ñ/°·±¼eÀF»mÓLˆØ�‰×Ñ Ð%JÔKà�<‰<˜!ÓÜ˜vŸ|™|Ò+Ó.ˆFØ—+‘+×/Ñ/°·±¸fÓEˆCØ�K‰K×#Ñ# CÐ)IÔJà—<‘<×&Ñ& vÓ.Ð.àr   )r}   r1   rž   N)rp   rq   rr   rs   rL   r€   r‡   rŠ   r¦   rœ   r�   rx   r   r   r   rz   rz   É   s(   † ò<òCò
=ò=ò: òxGõr   rz   )©r   r   )r   é   ©r   r   )r   rB   )r   r   )é   r   )r³   r   )r³   rB   )r±   r   )r±   rB   )r±   r   )rO   r   ©rO   r³   ©rO   r±   )rO   é	   ©r¶   r   )r°   r´   )r°   rµ   )r°   r·   )r²   r·   ))é   rB   )r¸   r   )r¸   r   )r¸   r   )r¸   r³   )r¸   r±   )r¸   rO   )é   r   )r¹   r   )r¹   rB   )r¹   r   )r¹   r   c                 ó   •  [         U    u  p[        [         Vs/ s H  nXs=::  a  U::  d  M  O  M  UPM     sn5      $ s  snf ! [         a?    [        [         Vs/ s H  nU[        R
                  :¼  d  M  UPM     Os  snf sn5      s $ f = frV   )Ú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Ò#7˜RØÕ/¨Ñ/ó Ù/õ Ñ#7ñ 1ó 2ð 	2ùò 1øäó <ô Õ#7ó ;Ò#7˜RØœv×9Ñ9Ñ9÷ Ò#7ùô ;ó <ò 	<ð<ús9   ‚A š?®?²?¸A ¿A ÁBÁA>
Á7A>
Á=BÂBc                  óú   •  SSK Jn   U R                  5       n[        [        5      nX:  a9  SnUS    SUS    3nSU SUS    SUS    S3n[
        R                  " U5        U$ [        U5      nU$ !   SnUs $ = f)	Nr   )Úruntimer   Ú.r   zCUDA Toolkit z is unsupported by Numba - z! is the minimum required version.)Únumba.cuda.cudadrv.runtimerÆ   r_   Úminr»   rŸ   r    rÄ   )rÆ   Úcudart_versionÚ_supported_ccÚ
min_cudartÚctk_verÚunsupported_vers         r   rH   rH   ^  s¬   € ðÝ6Ø ×,Ñ,Ó.ˆô ”]Ó#€JØÓ"ØˆØ# AÑ&Ð' q¨¸Ñ):Ð(;Ð<ˆØ*¨7¨)Ð3NØ(¨™m˜_¨A¨j¸©m¨_ð =/ð/ˆô 	�Š�oÔ&ØÐä(¨Ó8€MØÐøð%ð ˆØÒús   ‚A2 Á2A:c                 óâ   • [        5       R                  nU(       d  Sn[        U5      e[        U5       H4  u  p4X@:X  a  Us  $ X@:”  d  M  US:X  a  SX-   -  n[        U5      eXS-
     s  $    U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   rW   r   Ú	enumerate)ÚmyccrW   rm   ÚirÃ   s        r   Úfind_closest_archrÔ   w  s†   € ô “F×(Ñ(€MæðQˆä˜sÓ#Ð#ä˜=Ö)‰ˆØ‹:àŠIØ�Yà�A‹vð+Ø.2©iñ9�ä& sÓ+Ð+ð %¨¡UÑ+Ò+ñ *ð  ˜ÑÐr   c                 óx   • [         R                  (       a  [         R                  nSU-  $ [        X45      nSU-  $ )z1Matches with the closest architecture option
    zcompute_%d%d)r   ÚFORCE_CUDA_CCrÔ   )r\   r]   Ú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                   ó$   • \ rS rSrSrS rS rSrg)Ú	LibDevicei¯  Nc                 ó’   • U R                   c)  [        5       c  [        [        5      e[	        5       U l         U R                   U l        g rV   )Ú_cache_r   ÚRuntimeErrorÚMISSING_LIBDEVICE_FILE_MSGr   ÚbcrR   s    r   rL   ÚLibDevice.__init__²  s5   € Ø�<‰<ÑÜ‹Ñ&Ü"Ô#=Ó>Ð>Ü)Ó+ˆDŒLà—,‘,ˆ�r   c                 ó   • U R                   $ rV   )rß   rR   s    r   ÚgetÚLibDevice.getº  s   € Ø�w‰wˆr   )rÜ   rß   )rp   rq   rr   rs   rÜ   rL   râ   rx   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                 ó(   • [         R                  U S9$ )N©ÚTi)Úcas_nvvmÚformatrå   s    r   Úir_casré   #  s   € Ü�?‰?˜bˆ?Ð!Ð!r   c           	      óV   • [        XX#[        U5      S9n[        R                  " S0 UD6$ )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                 óZ   • [        XX#UU[        U5      S9n[        R                  " S0 UD6$ )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÷   ,  s1   € Ü�A #¸Ø¤¨£ñ-€Fô +×1Ò1Ñ;°FÑ;Ð;r   c                 ó<   • [         R                  X[        U 5      S9$ ©N)rë   ÚTurî   )Úir_numba_atomic_inc_templaterè   ré   ©rë   rú   s     r   Úir_numba_atomic_incrý   3  ó   € Ü'×.Ñ.°¼vÀa»yÐ.ÐIÐIr   c                 ó<   • [         R                  X[        U 5      S9$ rù   )Úir_numba_atomic_dec_templaterè   ré   rü   s     r   Úir_numba_atomic_decr  7  rþ   r   c                 óÄ  • S[        SSSSS94S[        SS	S
SS94S[        SSS
SS94S[        SSS94S[        SSS94S[        SS	SSSSS94S[        SSSSSSS94S[        SS	SSSSS94S[        SSSSSSS94S[        SS	SSSSS94S[        SSSSSSS94S [        SS	SS!SSS94S"[        SSSS!SSS94S#/nU H  u  p#U R	                  X#5      n M     [        U 5      n U $ )$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 !‰ˆØ—‘ Ó)Šñ !ô ˜fÓ%€Fà€Mr   c                 ó~  • [        U [        5      (       a  U /n UR                  SS5      (       a  UR                  SSSSS.5        [	        5       n[        5       nU  H.  n[        U5      nUR                  UR                  S5      5        M0     UR                  UR                  5       5        UR                  " S0 UD6$ )NÚfastmathFT)ÚftzÚfmaÚprec_divÚ	prec_sqrtr™   r   )r’   ÚstrÚpopÚupdaterz   rÚ   r  r‡   r›   rŠ   râ   r¦   )r  ÚoptsÚcuÚ	libdeviceÚmods        r   Ú
compile_irr%  j  s¦   € Ü�&œ#×ÑØ�ˆà‡x�x�
˜E×"Ñ"Ø�‰ØØØØñ	
ô 	ô 
Ó	€BÜ“€IãˆÜ˜3ÓˆØ
�‰�c—j‘j Ó(Ö)ñ ð ×Ñ�y—}‘}“Ô'à�:Š:Ñ˜ÑÐr   z"^attributes #\d+ = \{ ([\w\s]+)\ }c                 ó€  • / nU R                   " 5        H—  nUR                  S5      (       am  [        R                  U5      nUR	                  S5      R                  5       nSR                  S U 5       5      nUR                  UR	                  S5      U5      nUR                  U5        M™     SR                  U5      $ )z$
Convert LLVM 14.0 IR for LLVM 7.0.
zattributes #r   Ú c              3   ó4   #   • U  H  oS :w  d  M
  Uv •  M     g7f)Ú
willreturnNr   )Ú.0Úas     r   Ú	<genexpr>Ú#llvm140_to_70_ir.<locals>.<genexpr>Ž  s   é € ÐCª 1°lÑ1BŸQ™Qªù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                 óf  • U R                   n[        R                  " US5      n[        R                  " [        R                  " S5      S5      nUR                  XU45      n[        R                  " US5      nUR                  U5        [        R                  " S5      R                  5       n[        R                  " US5      nU R                  U5      n[        R                  " XS5      n	SU	l        SU	l        [        R                  " Xx/5      U	l        U R                   R#                  S	5        g
)aD  
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.annotationsrO   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_kernelrW  –  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                 óÚ   • [         R                  " S5      n[        5       R                  5        Vs/ s H
  o!" U5      PM     nnU R	                  U5      nU R                  SU5        gs  snf )zAdd NVVM IR version to moduler<  znvvmir.versionN)r
   rB  r   rC   rC  Úadd_named_metadata)r$  r  r–   rK   Úmd_vers        r   Úadd_ir_versionr[  ½  s\   € ô �*Š*�R‹.€CÜ#'£6×#8Ñ#8Ô#:Ó;Ò#:˜a�3�q–6Ñ#:€KÐ;Ø×Ñ˜kÓ*€FØ×ÑÐ+¨VÕ4ùò <s   ±A()Mrt   ÚloggingÚrerj   rŸ   Úctypesr   r   r   r   r   r   r	   Ú	threadingÚllvmliter
   rl   r   r   r   Úlibsr   r   r   Ú
numba.corer   r   Ú	getLoggerrp   ÚloggerÚADDRSPACE_GENERICÚADDRSPACE_GLOBALÚADDRSPACE_SHAREDÚADDRSPACE_CONSTANTÚADDRSPACE_LOCALrv   ru   r3  rh   rÑ   rÓ   r•   r8   ÚmodulesrP   rQ   r   ÚLockr-   r/   r   rz   r½   r»   rÄ   rH   rÔ   rØ   rÞ   rÚ   rç   rð   rû   r   rö   ré   rò   r÷   rý   r  r  r%  r¦   r0  r  rW  r[  r   r   r   Ú<module>rl     sÈ  ðñó Û 	Û 
Û ÷÷ ñ ó å ç ;Ñ ;ß =Ñ =ß &ð 
×	Ò	˜8Ó	$€àÐ ØÐ ØÐ ØÐ Ø€ð €ð €ð÷ 
�EƒGð ñ Ð'Ö(�D€A€qÙˆC�K‰K˜Ñ! 1 aÖ(ñ )ð
;Ð ð7Ð ò
	ð �^Š^Ó€
ô{ˆ6ô {ô|k�fô kð\Ð ð ØØØØØØØØØØØñ€ò 
<òò2òD!ð	Ð ô�ô ð€ð#Ð ð, Ð ð( Ð ð(#Ð ò@"ò<ò
<òJòJò,ò^ð. —J’JÐDÓEÐ òò$$,óN5r   