σ
\K]c           @` sX  d  d l  m Z m Z m Z d  d l Z d  d l j j Z d d l	 m
 Z
 d d l m Z d  d l m Z d   Z d   Z d	   Z d
   Z d   Z d   Z d   Z d   Z d   Z d   Z i d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d  6d! d" 6d# d$ 6d% d& 6d' d( 6d) d* 6d+ d, 6Z d-   Z d. e f d/     YZ d0   Z d S(1   i    (   t   print_functiont   absolute_importt   divisionNi   (   t   nvvm(   t   current_context(   t   cgutilsc         C` sp   d } t  j j t  j j d  t  j j t  j j d   t  j j d  t  j j d  f  } |  j | |  S(   Nt   ___numba_cas_hacki    (   t   lct   Typet   functiont   intt   pointert   get_or_insert_function(   t   lmodt   fnamet   fnty(    (    s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pyt   declare_atomic_cas_int32	   s    Bc         C` s^   d } t  j j t  j j   t  j j t  j j   d  t  j j   f  } |  j | d | S(   Ns#   llvm.nvvm.atomic.load.add.f32.p0f32i    t   name(   R   R   R	   t   floatR   R   (   R   R   R   (    (    s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pyt   declare_atomic_add_float32   s    0c         C` sv   t    j j d k r d } n d } t j j t j j   t j j t j j    t j j   f  } |  j | |  S(   Ni   i    s#   llvm.nvvm.atomic.load.add.f64.p0f64t   ___numba_atomic_double_add(   i   i    (	   R   t   devicet   compute_capabilityR   R   R	   t   doubleR   R   (   R   R   R   (    (    s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pyt   declare_atomic_add_float64   s    	-c         C` sX   d } t  j j t  j j   t  j j t  j j    t  j j   f  } |  j | |  S(   Nt   ___numba_atomic_float_max(   R   R   R	   R   R   R   (   R   R   R   (    (    s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pyt   declare_atomic_max_float32!   s    -c         C` sX   d } t  j j t  j j   t  j j t  j j    t  j j   f  } |  j | |  S(   Nt   ___numba_atomic_double_max(   R   R   R	   R   R   R   (   R   R   R   (    (    s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pyt   declare_atomic_max_float64(   s    -c         C` sX   d } t  j j t  j j   t  j j t  j j    t  j j   f  } |  j | |  S(   Nt   ___numba_atomic_float_min(   R   R   R	   R   R   R   (   R   R   R   (    (    s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pyt   declare_atomic_min_float32/   s    -c         C` sX   d } t  j j t  j j   t  j j t  j j    t  j j   f  } |  j | |  S(   Nt   ___numba_atomic_double_min(   R   R   R	   R   R   R   (   R   R   R   (    (    s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pyt   declare_atomic_min_float646   s    -c   
      C` sΔ   i d t  j 6d t  j 6d t  j 6| } t |  } i d d 6d d 6j | |  } d | d	 } | | | | f } t j j |  } t j j | |  } t j j	 | | g  }	 |  j
 |	 |  S(
   Nt   sharedt   localt   constantt   f32R   t   f64R   s   llvm.nvvm.ptr.s   .to.gen.p0%s.p%d%s(   R   t   ADDRSPACE_SHAREDt   ADDRSPACE_LOCALt   ADDRSPACE_CONSTANTt   strt   getR   R   R   R	   R   (
   R   t   elemtypet	   addrspacet   addrspacenamet   tynamet   s2g_name_fmtt   s2g_namet   elem_ptr_tyt   elem_ptr_ty_addrspacet   s2g_fnty(    (    s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pyt   insert_addrspace_conv=   s    


 c   	      C` sΔ   |  j  j j } t j j |  } | j | j d d d t j	 } t j
 | _ t | _ | | _ t j j d  } t j j | t j	  } |  j | |  } t | | t j	  } |  j | | g  S(   NR   t   _strR,   i   (   t   basic_blockR	   t   moduleR   t   Constantt   stringzt   add_global_variablet   typeR   R(   t   LINKAGE_INTERNALt   linkaget   Truet   global_constantt   initializerR   R
   R   t   bitcastR4   t   call(	   t   buildert   valueR   t   cvalt   glt   chartyt   constcharptrtyt   charptrt   conv(    (    s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pyt   declare_stringN   s    		c         C` sX   t  j j t  j j d   } t  j j t  j j   | | g  } |  j | d  } | S(   Ni   t   vprintf(   R   R   R   R
   R	   R   (   R   t	   voidptrtyt	   vprintftyRL   (    (    s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pyt   declare_vprint^   s    $s   llvm.nvvm.read.ptx.sreg.tid.xs   tid.xs   llvm.nvvm.read.ptx.sreg.tid.ys   tid.ys   llvm.nvvm.read.ptx.sreg.tid.zs   tid.zs   llvm.nvvm.read.ptx.sreg.ntid.xs   ntid.xs   llvm.nvvm.read.ptx.sreg.ntid.ys   ntid.ys   llvm.nvvm.read.ptx.sreg.ntid.zs   ntid.zs   llvm.nvvm.read.ptx.sreg.ctaid.xs   ctaid.xs   llvm.nvvm.read.ptx.sreg.ctaid.ys   ctaid.ys   llvm.nvvm.read.ptx.sreg.ctaid.zs   ctaid.zs    llvm.nvvm.read.ptx.sreg.nctaid.xs   nctaid.xs    llvm.nvvm.read.ptx.sreg.nctaid.ys   nctaid.ys    llvm.nvvm.read.ptx.sreg.nctaid.zs   nctaid.zs    llvm.nvvm.read.ptx.sreg.warpsizet   warpsizes   llvm.nvvm.read.ptx.sreg.laneidt   laneidc         C` sP   |  j  } t j j t j j   d  } | j | d t | } |  j | d  S(   NR   (    (    (   R7   R   R   R	   R
   R   t   SREG_MAPPINGRB   (   RC   R   R7   R   t   fn(    (    s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pyt	   call_sreg~   s    	t   SRegBuilderc           B` s>   e  Z d    Z d   Z d   Z d   Z d   Z d   Z RS(   c         C` s   | |  _  d  S(   N(   RC   (   t   selfRC   (    (    s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pyt   __init__   s    c         C` s   t  |  j d |  S(   Ns   tid.%s(   RT   RC   (   RV   t   xyz(    (    s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pyt   tid   s    c         C` s   t  |  j d |  S(   Ns   ctaid.%s(   RT   RC   (   RV   RX   (    (    s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pyt   ctaid   s    c         C` s   t  |  j d |  S(   Ns   ntid.%s(   RT   RC   (   RV   RX   (    (    s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pyt   ntid   s    c         C` s   t  |  j d |  S(   Ns	   nctaid.%s(   RT   RC   (   RV   RX   (    (    s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pyt   nctaid   s    c         C` sU   |  j  |  } |  j |  } |  j |  } |  j j |  j j | |  |  } | S(   N(   RY   R[   RZ   RC   t   addt   mul(   RV   RX   RY   R[   R\   t   res(    (    s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pyt   getdim   s
    $(   t   __name__t
   __module__RW   RY   RZ   R[   R\   R`   (    (    (    s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pyRU      s   					c         ` sY   t  |       f d   d D } t t j | d  |   } | d k rQ | d S| Sd  S(   Nc         3` s   |  ] }   j  |  Vq d  S(   N(   R`   (   t   .0RX   (   t   sreg(    s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pys	   <genexpr>   s    RX   i   i    (   RU   t   listt	   itertoolst   islicet   None(   RC   t   dimt   itt   seq(    (   Rd   s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pyt   get_global_id   s    (   t
   __future__R    R   R   Rf   t   llvmlite.llvmpy.coret   llvmpyt   coreR   t   cudadrvR   t   apiR   t   numbaR   R   R   R   R   R   R   R    R4   RK   RO   RR   RT   t   objectRU   Rl   (    (    (    s3   lib/python2.7/site-packages/numba/cuda/nvvmutils.pyt   <module>   sB   			
							

	