B
      ›\*)  ã               @   sX  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G dd„ dejƒZe dej ¡Z!d Z"dZ#dZ$dZ%dZ&dZ'dZ(dZ)G dd„ dej*ƒZ+dd„ Z,e,ƒ Z-G dd„ deƒZ.dd „ Z/d!d"„ Z0d#d$„ Z1d%d&„ Z2d'd(„ Z3d)d*„ Z4G d+d,„ d,eƒZ5dS )-é    )Úprint_functionÚabsolute_importN)Úcore)Úir)Úbinding)ÚtypingÚtypesÚutilsÚcgutils)Úcached_property)Ú	datamodel)ÚBaseContext)ÚMinimalCallConvé   )Úcodegen)Ú
DATALAYOUTZspir_kernelÚ c               @   s   e Zd Zdd„ ZdS )ÚHSATypingContextc             C   s,   ddl m}m} |  |j¡ |  |j¡ d S )Nr   )ÚhsadeclÚmathdecl)r   r   r   Zinstall_registryÚregistry)Úselfr   r   © r   ú/lib/python3.7/site-packages/numba/roc/target.pyÚload_additional_registries   s    z+HSATypingContext.load_additional_registriesN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r      s   r   z	[^a-z0-9]é   é   é   é   é   )r   r   c                   s   e Zd Z‡ fdd„Z‡  ZS )ÚGenericPointerModelc                s2   t }| |j¡ ¡  |¡}tt| ƒ |||¡ d S )N)ÚSPIR_GENERIC_ADDRSPACEÚlookupZdtypeZget_data_typeÚ
as_pointerÚsuperr#   Ú__init__)r   ÚdmmZfe_typeÚadrspZbe_type)Ú	__class__r   r   r(   4   s    zGenericPointerModel.__init__)r   r   r   r(   Ú__classcell__r   r   )r+   r   r#   3   s   r#   c              C   s   t j ¡ } |  tjt¡ | S )N)r   Zdefault_managerÚcopyÚregisterr   ZCPointerr#   )r)   r   r   r   Ú_init_data_model_manager:   s    
r/   c                   s„   e Zd ZdZeZdd„ Zdd„ Zedd„ ƒZ	dd	„ Z
ed
d„ ƒZdd„ Zdd„ Zdd„ Zdd„ Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚHSATargetContextTc             C   s(   t  d¡| _t ttj ¡| _t	| _
d S )Nznumba.hsa.jit)r   ZJITHSACodegenÚ_internal_codegenÚllZcreate_target_datar   r	   ZMACHINE_BITSÚ_target_dataÚhsa_data_model_managerZdata_model_manager)r   r   r   r   ÚinitG   s    zHSATargetContext.initc             C   s0   ddl m}m} |  |jj¡ |  |jj¡ d S )Nr   )ÚhsaimplÚmathimpl)r   r6   r7   Zinsert_func_defnr   Z	functions)r   r6   r7   r   r   r   r   M   s    z+HSATargetContext.load_additional_registriesc             C   s   t | ƒS )N)ÚHSACallConv)r   r   r   r   Ú	call_convS   s    zHSATargetContext.call_convc             C   s   | j S )N)r1   )r   r   r   r   r   W   s    zHSATargetContext.codegenc             C   s   | j S )N)r3   )r   r   r   r   Útarget_dataZ   s    zHSATargetContext.target_datac             C   s8   dd„ }|d d  dd„ |D ƒ¡ }t ||¡}d| S )Nc             S   s   |   d¡}dt|ƒ S )Nr   z_%X_)ÚgroupÚord)ÚmZchr   r   r   Úrepl_   s    
z&HSATargetContext.mangler.<locals>.replÚ.c             s   s   | ]}t |ƒV  qd S )N)Ústr)Ú.0Úar   r   r   ú	<genexpr>c   s    z+HSATargetContext.mangler.<locals>.<genexpr>Zhsapy_devfn_)ÚjoinÚVALID_CHARSÚsub)r   ÚnameÚargtypesr>   Z	qualifiedZmangledr   r   r   Úmangler^   s    zHSATargetContext.manglerc             C   s(   |j }d|_t| j |_|  ||¡}|S )NÚlinkonce_odr)ÚmoduleÚlinkager   Zaddress_sizeZdata_layoutÚgenerate_kernel_wrapper)r   ÚfuncrH   rK   Úwrapperr   r   r   Úprepare_hsa_kernelg   s
    z#HSATargetContext.prepare_hsa_kernelc             C   s   t |_d|_|S )NrJ   )ÚCC_SPIR_FUNCÚcalling_conventionrL   )r   rN   r   r   r   Úmark_hsa_devicep   s    z HSATargetContext.mark_hsa_devicec             C   sŒ  |j }|  |¡}dd„ }t|jƒdkr<tt||jƒŽ \}}nd }}tj tj 	¡ |¡}|  
d¡}	dj|jd}
t|jƒ}tj tj ¡ | j tj¡g| ¡}|	j||jd}t|_|	j||
d}t | d¡¡}g }xFt|j|ƒD ]6\}}|d k	r|  |||¡}| |¡ qä| |¡ qäW | ||¡}| j ||tj	||¡\}}| ¡  t|ƒ | t  !t"|	ƒ¡¡ d	|_#| $|j¡}d	| $|j¡_#|S )
Nc             S   s&   t | tjƒr| j t¡| jfS | d fS )N)Ú
isinstanceÚllvmirÚPointerTypeÚpointeer&   ÚSPIR_GLOBAL_ADDRSPACEÚ	addrspace)Zltyr   r   r   Úsub_gen_with_global{   s    
zEHSATargetContext.generate_kernel_wrapper.<locals>.sub_gen_with_globalr   r   zhsa.kernel.wrapperzhsaPy_{name})rG   r   Zinternal)%rK   Úget_arg_packerÚlenZargument_typesÚzipÚmapÚlcÚTypeZfunctionZvoidÚcreate_moduleÚformatrG   ÚlistÚintr9   Zget_return_typer   ZpyobjectZadd_functionrQ   rR   ZBuilderZappend_basic_blockÚargsÚaddrspacecastÚappendZfrom_argumentsÚcall_functionZret_voidÚset_hsa_kernelZlink_inr2   Zparse_assemblyr@   rL   Zget_function)r   rN   rH   rK   ÚarginforZ   ZllargtysZchangedZwrapperfntyZwrapper_moduleZwrappernameÚargtysÚfntyrO   ÚbuilderZ
fixed_argsÚavr*   ZcastedZcallargsÚstatusÚ_r   r   r   rM   w   sD    



z(HSATargetContext.generate_kernel_wrapperc                s(   t t| ƒ ||¡}|j d¡r$t|_|S )NZhsapy_devfn)r'   r0   Údeclare_functionZllvm_func_nameÚ
startswithrQ   rR   )r   rK   ZfndescZret)r+   r   r   rq   ²   s    z!HSATargetContext.declare_functionc             C   s   t ‚dS )z%
        Return dummy value.
        N)ÚNotImplementedError)r   rm   ÚtypZaryr   r   r   Úmake_constant_array¹   s    z$HSATargetContext.make_constant_arrayc             C   s   t j|jj|d}| ||¡S )z&
        Handle addrspacecast
        )rY   )rU   rV   ÚtyperW   rf   )r   rm   ÚsrcrY   Zptrasr   r   r   rf   Â   s    zHSATargetContext.addrspacecast)r   r   r   Zimplement_powi_as_math_callr$   Zgeneric_addrspacer5   r   r   r9   r   Úpropertyr:   rI   rP   rS   rM   rq   ru   rf   r,   r   r   )r+   r   r0   C   s   		;	r0   c                s°   | j }t| _| d¡}| tj || t| ƒt	| ƒt
| ƒt| ƒt| ƒg¡¡ dd„ ‰ ‡ fdd„tD ƒ}| d¡}|jsˆ| tj ||¡¡ | d¡}|js¬| tj ||¡¡ dS )	za
    Ensure `fn` is usable as a SPIR kernel.
    - Fix calling convention
    - Add metadata
    zopencl.kernelsc             S   s   t j t j ¡ | ¡S )N)r_   ÚConstantrd   r`   )Úxr   r   r   Ú<lambda>â   s    z set_hsa_kernel.<locals>.<lambda>c                s   g | ]}ˆ |ƒ‘qS r   r   )rA   rz   )Úmake_constantr   r   ú
<listcomp>ã   s    z"set_hsa_kernel.<locals>.<listcomp>zopencl.spir.versionzopencl.ocl.versionN)rK   ÚCC_SPIR_KERNELrR   Zget_or_insert_named_metadataÚaddr_   ÚMetaDataÚgetÚgen_arg_addrspace_mdÚgen_arg_access_qual_mdÚgen_arg_typeÚgen_arg_type_qualÚgen_arg_base_typeÚSPIR_VERSIONZoperands)ÚfnÚmodZocl_kernelsZspir_version_constantZspir_versionZocl_versionr   )r|   r   ri   Ê   s"    


ri   c             C   sr   | j }| jj}g }x.|jD ]$}t |¡r4| t¡ q| t¡ qW dd„ |D ƒ}t	j
 |d¡}t	j ||g| ¡S )z1
    Generate kernel_arg_addr_space metadata
    c             S   s    g | ]}t j t j ¡ |¡‘qS r   )r_   ry   rd   r`   )rA   rz   r   r   r   r}     s    z(gen_arg_addrspace_md.<locals>.<listcomp>Zkernel_arg_addr_space)rK   rv   rW   re   r
   Z
is_pointerrg   rX   ÚSPIR_PRIVATE_ADDRSPACEr_   ÚMetaDataStringr   r€   )rˆ   r‰   rl   ZcodesrB   ÚconstsrG   r   r   r   r‚   ú   s    
r‚   c             C   sB   | j }tj |d¡gt| jƒ }tj |d¡}tj ||g| ¡S )z2
    Generate kernel_arg_access_qual metadata
    ZnoneZkernel_arg_access_qual)rK   r_   r‹   r   r\   re   r€   )rˆ   r‰   rŒ   rG   r   r   r   rƒ     s    rƒ   c                sD   | j ‰ | jj}‡ fdd„|jD ƒ}tj ˆ d¡}tj ˆ |g| ¡S )z+
    Generate kernel_arg_type metadata
    c                s   g | ]}t j ˆ t|ƒ¡‘qS r   )r_   r‹   r   r@   )rA   rB   )r‰   r   r   r}     s    z gen_arg_type.<locals>.<listcomp>Zkernel_arg_type)rK   rv   rW   re   r_   r‹   r   r€   )rˆ   rl   rŒ   rG   r   )r‰   r   r„     s
    r„   c                sD   | j ‰ | jj}‡ fdd„|jD ƒ}tj ˆ d¡}tj ˆ |g| ¡S )z0
    Generate kernel_arg_type_qual metadata
    c                s   g | ]}t j ˆ d ¡‘qS )r   )r_   r‹   r   )rA   rp   )r‰   r   r   r}   (  s    z%gen_arg_type_qual.<locals>.<listcomp>Zkernel_arg_type_qual)rK   rv   rW   re   r_   r‹   r   r€   )rˆ   rl   rŒ   rG   r   )r‰   r   r…   "  s
    r…   c                sD   | j ‰ | jj}‡ fdd„|jD ƒ}tj ˆ d¡}tj ˆ |g| ¡S )z0
    Generate kernel_arg_base_type metadata
    c                s   g | ]}t j ˆ t|ƒ¡‘qS r   )r_   r‹   r   r@   )rA   rB   )r‰   r   r   r}   3  s    z%gen_arg_base_type.<locals>.<listcomp>Zkernel_arg_base_type)rK   rv   rW   re   r_   r‹   r   r€   )rˆ   rl   rŒ   rG   r   )r‰   r   r†   -  s
    r†   c               @   s   e Zd Zddd„ZdS )r8   Nc             C   s˜   |dkst ‚|jd jj}t ||¡}| t |¡|¡ | j 	|¡}	|	 
||¡}|gt|ƒ }
| ||
¡}|  ||¡}| |¡}| j |||¡}||fS )z3
        Call the Numba-compiled *callee*.
        Nr   )ÚAssertionErrorre   rv   rW   r
   Zalloca_onceZstoreZget_null_valueÚcontextr[   Zas_argumentsrc   ZcallZ_get_return_statusÚloadZget_returned_value)r   rm   ZcalleeZrestyrk   re   ÚenvZrettyZ	retvaltmprj   ZrealargsÚcodero   ZretvalÚoutr   r   r   rh   9  s    
zHSACallConv.call_function)N)r   r   r   rh   r   r   r   r   r8   8  s   r8   )6Z
__future__r   r   ÚreZllvmlite.llvmpyr   r_   Zllvmliter   rU   r   r2   Znumbar   r   r	   r
   Znumba.utilsr   r   Znumba.targets.baser   Znumba.targets.callconvr   r   r   Zhlcr   r~   rQ   r   ÚcompileÚIrE   r$   rX   ZSPIR_REGION_ADDRSPACEZSPIR_CONSTANT_ADDRSPACEZSPIR_LOCAL_ADDRSPACErŠ   ZSPIR_CONSTANT_32BIT_ADDRSPACEr‡   ZPrimitiveModelr#   r/   r4   r0   ri   r‚   rƒ   r„   r…   r†   r8   r   r   r   r   Ú<module>   sF    0
