σ
\K]c           @@ sΟ  d  d l  m Z m Z d  d l Z d  d l m Z d  d l m Z	 d  d l m
 Z d  d l m Z m Z m Z m Z d  d l m Z d  d l m Z d  d	 l m Z d  d
 l m Z d d l m Z d d l m Z d Z d Z d e j f d     YZ e j d e j   Z! d  Z" d Z# d Z$ d Z% d Z& d Z' d Z( d% Z) d e j* f d     YZ+ d   Z, e,   Z- d e f d     YZ. d   Z/ d   Z0 d   Z1 d    Z2 d!   Z3 d"   Z4 d# e f d$     YZ5 d S(&   i    (   t   print_functiont   absolute_importN(   t   core(   t   ir(   t   binding(   t   typingt   typest   utilst   cgutils(   t   cached_property(   t	   datamodel(   t   BaseContext(   t   MinimalCallConvi   (   t   codegen(   t
   DATALAYOUTt   spir_kernelt    t   HSATypingContextc           B@ s   e  Z d    Z RS(   c         C@ s:   d d l  m } m } |  j | j  |  j | j  d  S(   Ni   (   t   hsadeclt   mathdecl(   R   R   R   t   install_registryt   registry(   t   selfR   R   (    (    s/   lib/python2.7/site-packages/numba/roc/target.pyt   load_additional_registries   s    (   t   __name__t
   __module__R   (    (    (    s/   lib/python2.7/site-packages/numba/roc/target.pyR      s   s	   [^a-z0-9]i   i   i   i   i   t   GenericPointerModelc           B@ s   e  Z d    Z RS(   c         C@ sG   t  } | j | j  j   j |  } t t |   j | | |  d  S(   N(   t   SPIR_GENERIC_ADDRSPACEt   lookupt   dtypet   get_data_typet
   as_pointert   superR   t   __init__(   R   t   dmmt   fe_typet   adrspt   be_type(    (    s/   lib/python2.7/site-packages/numba/roc/target.pyR!   4   s    !(   R   R   R!   (    (    (    s/   lib/python2.7/site-packages/numba/roc/target.pyR   3   s   c          C@ s&   t  j j   }  |  j t j t  |  S(   N(   R
   t   default_managert   copyt   registerR   t   CPointerR   (   R"   (    (    s/   lib/python2.7/site-packages/numba/roc/target.pyt   _init_data_model_manager:   s    t   HSATargetContextc           B@ s   e  Z e Z e Z d    Z d   Z e d    Z	 d   Z
 e d    Z d   Z d   Z d   Z d   Z d	   Z d
   Z d   Z RS(   c         C@ s8   t  j d  |  _ t j t t j  |  _ t	 |  _
 d  S(   Ns   numba.hsa.jit(   R   t   JITHSACodegent   _internal_codegent   llt   create_target_dataR   R   t   MACHINE_BITSt   _target_datat   hsa_data_model_managert   data_model_manager(   R   (    (    s/   lib/python2.7/site-packages/numba/roc/target.pyt   initG   s    c         C@ s@   d d l  m } m } |  j | j j  |  j | j j  d  S(   Ni   (   t   hsaimplt   mathimpl(   R   R5   R6   t   insert_func_defnR   t	   functions(   R   R5   R6   (    (    s/   lib/python2.7/site-packages/numba/roc/target.pyR   M   s    c         C@ s
   t  |   S(   N(   t   HSACallConv(   R   (    (    s/   lib/python2.7/site-packages/numba/roc/target.pyt	   call_convS   s    c         C@ s   |  j  S(   N(   R-   (   R   (    (    s/   lib/python2.7/site-packages/numba/roc/target.pyR   W   s    c         C@ s   |  j  S(   N(   R1   (   R   (    (    s/   lib/python2.7/site-packages/numba/roc/target.pyt   target_dataZ   s    c         C@ sD   d   } | d d j  d   | D  } t j | |  } d | S(   Nc         S@ s   |  j  d  } d t |  S(   Ni    s   _%X_(   t   groupt   ord(   t   mt   ch(    (    s/   lib/python2.7/site-packages/numba/roc/target.pyt   repl_   s    t   .c         s@ s   |  ] } t  |  Vq d  S(   N(   t   str(   t   .0t   a(    (    s/   lib/python2.7/site-packages/numba/roc/target.pys	   <genexpr>c   s    t   hsapy_devfn_(   t   joint   VALID_CHARSt   sub(   R   t   namet   argtypesR@   t	   qualifiedt   mangled(    (    s/   lib/python2.7/site-packages/numba/roc/target.pyt   mangler^   s    	!c         C@ s8   | j  } d | _ t |  j | _ |  j | |  } | S(   Nt   linkonce_odr(   t   modulet   linkageR   t   address_sizet   data_layoutt   generate_kernel_wrapper(   R   t   funcRJ   RO   t   wrapper(    (    s/   lib/python2.7/site-packages/numba/roc/target.pyt   prepare_hsa_kernelg   s
    		c         C@ s   t  | _ d | _ | S(   NRN   (   t   CC_SPIR_FUNCt   calling_conventionRP   (   R   RT   (    (    s/   lib/python2.7/site-packages/numba/roc/target.pyt   mark_hsa_devicep   s    		c         C@ s8  | j  } |  j |  } d   } t | j  d k rW t t | | j    \ } } n
 d } } t j j t j j	   |  } |  j
 d  }	 d j d | j  }
 t | j  } t j j t j j   |  j j t j  g |  } |	 j | d | j } t | _ |	 j | d |
 } t j | j d   } g  } x^ t | j |  D]J \ } } | d  k	 r|  j | | |  } | j |  qM| j |  qMW| j | |  } |  j j | | t j	 | |  \ } } | j   t |  | j  t! j" t# |	    d | _$ | j% | j  } d | j% | j  _$ | S(	   Nc         S@ s5   t  |  t j  r+ |  j j t  |  j f S|  d  f S(   N(   t
   isinstancet   llvmirt   PointerTypet   pointeeR   t   SPIR_GLOBAL_ADDRSPACEt	   addrspacet   None(   t   lty(    (    s/   lib/python2.7/site-packages/numba/roc/target.pyt   sub_gen_with_global{   s    
i    s   hsa.kernel.wrappers   hsaPy_{name}RI   R   t   internal(    (&   RO   t   get_arg_packert   lent   argument_typest   zipt   mapt   lct   Typet   functiont   voidt   create_modulet   formatRI   t   listt   intR:   t   get_return_typeR   t   pyobjectt   add_functionRW   RX   t   Buildert   append_basic_blockt   argsR`   t   addrspacecastt   appendt   from_argumentst   call_functiont   ret_voidt   set_hsa_kernelt   link_inR.   t   parse_assemblyRB   RP   t   get_function(   R   RT   RJ   RO   t   arginfoRb   t   llargtyst   changedt   wrapperfntyt   wrapper_modulet   wrappernamet   argtyst   fntyRU   t   buildert
   fixed_argst   avR$   t   castedt   callargst   statust   _(    (    s/   lib/python2.7/site-packages/numba/roc/target.pyRS   w   sD    			
		

	c         C@ s=   t  t |   j | |  } | j j d  r9 t | _ n  | S(   Nt   hsapy_devfn(   R    R+   t   declare_functiont   llvm_func_namet
   startswithRW   RX   (   R   RO   t   fndesct   ret(    (    s/   lib/python2.7/site-packages/numba/roc/target.pyR   ²   s    c         C@ s
   t   d S(   s%   
        Return dummy value.
        N(   t   NotImplementedError(   R   R   t   typt   ary(    (    s/   lib/python2.7/site-packages/numba/roc/target.pyt   make_constant_arrayΉ   s    c         C@ s+   t  j | j j d | } | j | |  S(   s&   
        Handle addrspacecast
        R_   (   R[   R\   t   typeR]   Rw   (   R   R   t   srcR_   t   ptras(    (    s/   lib/python2.7/site-packages/numba/roc/target.pyRw   Β   s    (   R   R   t   Truet   implement_powi_as_math_callR   t   generic_addrspaceR4   R   R	   R:   R   t   propertyR;   RM   RV   RY   RS   R   R   Rw   (    (    (    s/   lib/python2.7/site-packages/numba/roc/target.pyR+   C   s   									;			c      
   C@ s  |  j  } t |  _ | j d  } | j t j j | |  t |   t	 |   t
 |   t |   t |   g   d   } g  t D] } | |  ^ q} } | j d  } | j sΜ | j t j j | |   n  | j d  } | j s| j t j j | |   n  d S(   sa   
    Ensure `fn` is usable as a SPIR kernel.
    - Fix calling convention
    - Add metadata
    s   opencl.kernelsc         S@ s   t  j j t  j j   |   S(   N(   Ri   t   ConstantRp   Rj   (   t   x(    (    s/   lib/python2.7/site-packages/numba/roc/target.pyt   <lambda>β   R   s   opencl.spir.versions   opencl.ocl.versionN(   RO   t   CC_SPIR_KERNELRX   t   get_or_insert_named_metadatat   addRi   t   MetaDatat   gett   gen_arg_addrspace_mdt   gen_arg_access_qual_mdt   gen_arg_typet   gen_arg_type_qualt   gen_arg_base_typet   SPIR_VERSIONt   operands(   t   fnt   modt   ocl_kernelst   make_constantR‘   t   spir_version_constantt   spir_versiont   ocl_version(    (    s/   lib/python2.7/site-packages/numba/roc/target.pyR|   Κ   s"    									c         C@ s»   |  j  } |  j j } g  } x= | j D]2 } t j |  rJ | j t  q% | j t  q% Wg  | D]$ } t	 j
 j t	 j j   |  ^ qb } t	 j j | d  } t	 j j | | g |  S(   s1   
    Generate kernel_arg_addr_space metadata
    t   kernel_arg_addr_space(   RO   R   R]   Rv   R   t
   is_pointerRx   R^   t   SPIR_PRIVATE_ADDRSPACERi   R    Rp   Rj   t   MetaDataStringR§   R¦   (   R―   R°   R   t   codesRD   R‘   t   constsRI   (    (    s/   lib/python2.7/site-packages/numba/roc/target.pyR¨   ϊ   s    	1c         C@ s]   |  j  } t j j | d  g t |  j  } t j j | d  } t j j | | g |  S(   s2   
    Generate kernel_arg_access_qual metadata
    t   nonet   kernel_arg_access_qual(   RO   Ri   RΉ   R§   Re   Rv   R¦   (   R―   R°   R»   RI   (    (    s/   lib/python2.7/site-packages/numba/roc/target.pyR©     s    	%c         C@ su   |  j  } |  j j } g  | j D]! } t j j | t |   ^ q } t j j | d  } t j j | | g |  S(   s+   
    Generate kernel_arg_type metadata
    t   kernel_arg_type(	   RO   R   R]   Rv   Ri   RΉ   R§   RB   R¦   (   R―   R°   R   RD   R»   RI   (    (    s/   lib/python2.7/site-packages/numba/roc/target.pyRͺ     s
    	1c         C@ so   |  j  } |  j j } g  | j D] } t j j | d  ^ q } t j j | d  } t j j | | g |  S(   s0   
    Generate kernel_arg_type_qual metadata
    R   t   kernel_arg_type_qual(   RO   R   R]   Rv   Ri   RΉ   R§   R¦   (   R―   R°   R   R   R»   RI   (    (    s/   lib/python2.7/site-packages/numba/roc/target.pyR«   "  s
    	+c         C@ su   |  j  } |  j j } g  | j D]! } t j j | t |   ^ q } t j j | d  } t j j | | g |  S(   s0   
    Generate kernel_arg_base_type metadata
    t   kernel_arg_base_type(	   RO   R   R]   Rv   Ri   RΉ   R§   RB   R¦   (   R―   R°   R   RD   R»   RI   (    (    s/   lib/python2.7/site-packages/numba/roc/target.pyR¬   -  s
    	1R9   c           B@ s   e  Z d d   Z RS(   c         C@ sά   | d k s t  | j d j j } t j | |  } | j t j |  |  |  j	 j
 |  }	 |	 j | |  } | g t |  }
 | j | |
  } |  j | |  } | j |  } |  j	 j | | |  } | | f S(   s3   
        Call the Numba-compiled *callee*.
        i    N(   R`   t   AssertionErrorRv   R   R]   R   t   alloca_oncet   storet   get_null_valuet   contextRd   t   as_argumentsRo   t   callt   _get_return_statust   loadt   get_returned_value(   R   R   t   calleet   restyR   Rv   t   envt   rettyt	   retvaltmpR   t   realargst   codeR   t   retvalt   out(    (    s/   lib/python2.7/site-packages/numba/roc/target.pyRz   9  s    N(   R   R   R`   Rz   (    (    (    s/   lib/python2.7/site-packages/numba/roc/target.pyR9   8  s   (   i   i    (6   t
   __future__R    R   t   ret   llvmlite.llvmpyR   Ri   t   llvmliteR   R[   R   R.   t   numbaR   R   R   R   t   numba.utilsR	   R
   t   numba.targets.baseR   t   numba.targets.callconvR   R   R   t   hlcR   R£   RW   R   t   compilet   IRG   R   R^   t   SPIR_REGION_ADDRSPACEt   SPIR_CONSTANT_ADDRSPACEt   SPIR_LOCAL_ADDRSPACERΈ   t   SPIR_CONSTANT_32BIT_ADDRSPACER­   t   PrimitiveModelR   R*   R2   R+   R|   R¨   R©   Rͺ   R«   R¬   R9   (    (    (    s/   lib/python2.7/site-packages/numba/roc/target.pyt   <module>   sD   "			0		
			