U
    ºmœdŒz  ã                   @   sÖ  d Z ddlmZ ddlmZmZmZmZmZm	Z	m
Z
mZmZmZ ddlmZ G dd„ deeƒZG dd„ deƒZed	d
dgƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deeƒZG dd„ deeƒZG dd„ deeƒZG d d!„ d!eƒZG d"d#„ d#eƒZG d$d%„ d%eƒZ G d&d'„ d'e ƒZ!G d(d)„ d)e ƒZ"G d*d+„ d+eƒZ#G d,d-„ d-eƒZ$G d.d/„ d/eƒZ%G d0d1„ d1eƒZ&G d2d3„ d3eƒZ'G d4d5„ d5eƒZ(G d6d7„ d7eƒZ)G d8d9„ d9eƒZ*G d:d;„ d;eƒZ+G d<d=„ d=eƒZ,G d>d?„ d?eƒZ-G d@dA„ dAeƒZ.G dBdC„ dCeƒZ/G dDdE„ dEeƒZ0G dFdG„ dGe1ƒZ2G dHdI„ dIeƒZ3G dJdK„ dKeƒZ4G dLdM„ dMe1ƒZ5G dNdO„ dOe5ƒZ6G dPdQ„ dQe5ƒZ7G dRdS„ dSeƒZ8G dTdU„ dUeƒZ9dVS )Wz)
Implementation of LLVM IR instructions.
é    )Útypes)
ÚBlockÚFunctionÚValueÚ
NamedValueÚConstantÚMetaDataArgumentÚMetaDataStringÚAttributeSetÚ	UndefinedÚArgumentAttributes)Ú_HasMetadatac                       sN   e Zd Zd‡ fdd„	Zedd„ ƒZedd„ ƒZd	d
„ Zdd„ Zdd„ Z	‡  Z
S )ÚInstructionÚ © c                    sV   t t| ƒj|||d� t|tƒs$t‚t|ttfƒs6t‚|| _|| _	t|ƒ| _
i | _d S ©N©Úname)Úsuperr   Ú__init__Ú
isinstancer   ÚAssertionErrorÚtupleÚlistÚopnameÚoperandsÚflagsÚmetadata)ÚselfÚparentÚtypr   r   r   r   ©Ú	__class__r   úQ/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/llvmlite/ir/instructions.pyr      s    
zInstruction.__init__c                 C   s   | j jS ©N)r   Úfunction©r   r   r   r#   r%      s    zInstruction.functionc                 C   s
   | j jjS r$   )r   r%   Úmoduler&   r   r   r#   r'      s    zInstruction.modulec                 C   s`   | j }| jrd |g| j ¡}d dd„ | jD ƒ¡}| j}| jdd�}| d ||||¡¡ d S )Nú ú, c                 S   s   g | ]}|  ¡ ‘qS r   )Úget_reference©Ú.0Úopr   r   r#   Ú
<listcomp>"   s     z%Instruction.descr.<locals>.<listcomp>T©Zleading_commaú{0} {1} {2}{3}
)r   r   Újoinr   ÚtypeÚ_stringify_metadataÚappendÚformat)r   Úbufr   r   r    r   r   r   r#   Údescr   s       ÿzInstruction.descrc                 C   sF   || j krBg }| j D ]}| ||kr(|n|¡ qt|ƒ| _ |  ¡  d S r$   )r   r4   r   Z_clear_string_cache)r   ÚoldÚnewZopsr-   r   r   r#   Úreplace_usage(   s    


zInstruction.replace_usagec                 C   s   d| j j| j| j| j| jf S )Nz/<ir.%s %r of type '%s', opname %r, operands %r>)r"   Ú__name__r   r2   r   r   r&   r   r   r#   Ú__repr__0   s       þzInstruction.__repr__)r   r   )r;   Ú
__module__Ú__qualname__r   Úpropertyr%   r'   r7   r:   r<   Ú__classcell__r   r   r!   r#   r      s   	


r   c                   @   s    e Zd ZeddddddgƒZdS )ÚCallInstrAttributesZnoreturnZnounwindÚreadonlyZreadnoneZnoinlineZalwaysinlineN©r;   r=   r>   Ú	frozensetZ_knownr   r   r   r#   rA   6   s   
 ÿrA   ÚtailZmusttailZnotailc                	   @   s$   e Zd ZeddddddddgƒZd	S )
ÚFastMathFlagsÚfastÚnnanÚninfÚnszÚarcpÚcontractÚafnÚreassocNrC   r   r   r   r#   rF   >   s    ÿrF   c                       sh   e Zd Zd‡ fdd„	Zedd„ ƒZejdd„ ƒZed	d
„ ƒZdd„ Zedd„ ƒZ	dd„ Z
dd„ Z‡  ZS )Ú	CallInstrr   Nr   c
                    sX  |d krt |tƒr|jn|| _t |tƒr2|tkr2n|r<d}nd}|| _t|ƒ| _t	|ƒ| _
i | _|	r¬|	 ¡ D ]>\}
}d|
  krŒt|ƒk sœn td |
¡ƒ‚t|ƒ| j|
< qlt|ƒ}tt|jjƒƒD ]f}|| }|jj| }t |tjƒrú|j|krút|ƒ}|j|k�r"d d| ||j¡}t|ƒ‚|||< qÄtt| ƒj||jjd|gt|ƒ |d� d S )	NrE   r   r   zInvalid argument index {}z%Type of #{0} arg mismatch: {1} != {2}é   Úcallr   )r   r   Zcalling_conventionÚcconvÚstrÚTailMarkerOptionsrE   rF   ÚfastmathrA   Ú
attributesÚarg_attributesÚitemsÚlenÚ
ValueErrorr5   r   r   ÚrangeÚfunction_typeÚargsr   ZMetaDataTyper2   r   Ú	TypeErrorr   rO   r   Úreturn_type)r   r   Úfuncr]   r   rR   rE   rU   ÚattrsÚ	arg_attrsÚidxÚiÚargÚexpected_typeÚmsgr!   r   r#   r   D   sV    ÿÿþ

ÿÿ  ÿ
  ÿzCallInstr.__init__c                 C   s
   | j d S ©Nr   ©r   r&   r   r   r#   Úcalleeo   s    zCallInstr.calleec                 C   s   || j d< d S rh   ri   )r   Z	newcalleer   r   r#   rj   s   s    c                 C   s   | j dd … S ©NrP   ri   r&   r   r   r#   r]   w   s    zCallInstr.argsc                 C   s    |j | jj krtdƒ‚|| _d S )Nz"New function has incompatible type)r\   rj   r^   )r   Znewfuncr   r   r#   Úreplace_callee{   s    zCallInstr.replace_calleec                 C   s   | j S )zThe callee function)rj   r&   r   r   r#   Úcalled_function€   s    zCallInstr.called_functionc           
         sø   ‡fdd„‰ d  ‡ fdd„tˆjƒD ƒ¡}ˆjj}|jr>|}n|j}d |ˆj ¡ ¡}ˆj	rjd ˆj	|¡}d}ˆj
r€d ˆj
¡}ˆjržd	d	  ˆj |j¡¡ nd}ˆjrÀd	d	  ˆj |j¡¡ nd}	| d
j|ˆj||	|||rêˆjdd�ndd�¡ d S )Nc                    s@   | ˆ j kr(d ˆ j |   |j¡¡d }nd}d |j|| ¡ ¡S )Nr(   r   ú
{0} {1}{2})rW   r1   Ú_to_listr2   r5   r*   )rd   Úara   r&   r   r#   Ú	descr_arg†   s    
z#CallInstr._descr.<locals>.descr_argr)   c                    s   g | ]\}}ˆ ||ƒ‘qS r   r   )r,   rd   rp   )rq   r   r#   r.   Œ   s     z$CallInstr._descr.<locals>.<listcomp>ú{0} {1}r   z{0} r(   z2{tail}{op}{fastmath} {callee}({args}){attr}{meta}
Tr/   )rE   r-   rj   rU   r]   ÚattrÚmeta)r1   Ú	enumerater]   rj   r\   Zvar_argr_   r5   r*   rR   rE   rV   ro   rU   r4   r   r3   )
r   r6   Úadd_metadatar]   ZfntyÚtyZ
callee_refZtail_markerZfn_attrsZfm_attrsr   )rq   r   r#   Ú_descr…   s>    ÿÿÿÿÿøzCallInstr._descrc                 C   s   | j |dd� d S )NT©rv   )rx   ©r   r6   r   r   r#   r7   ¯   s    zCallInstr.descr)r   NNr   r   N)r;   r=   r>   r   r?   rj   Úsetterr]   rl   rm   rx   r7   r@   r   r   r!   r#   rO   C   s          ÿ+



*rO   c                       s*   e Zd Zd‡ fdd„	Z‡ fdd„Z‡  ZS )	ÚInvokeInstrr   Nr   c                    sT   t |tƒst‚t |tƒst‚tt| ƒj|||||d||	|
d�	 d| _|| _|| _d S )NF)rE   rU   ra   rb   Zinvoke)	r   r   r   r   r|   r   r   Ú	normal_toÚ	unwind_to)r   r   r`   r]   r}   r~   r   rR   rU   ra   rb   r!   r   r#   r   ´   s      þzInvokeInstr.__init__c                    sB   t t| ƒj|dd� | dj| j ¡ | j ¡ | jdd�d�¡ d S )NFry   z.      to label {0} unwind label {1}{metadata}
Tr/   )r   )	r   r|   rx   r4   r5   r}   r*   r~   r3   rz   r!   r   r#   r7   ¿   s    
ýzInvokeInstr.descr)r   Nr   r   N©r;   r=   r>   r   r7   r@   r   r   r!   r#   r|   ³   s           ÿr|   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )Ú
Terminatorc                    s   t t| ƒ |t ¡ ||¡ d S r$   )r   r€   r   r   ÚVoidType)r   r   r   r   r!   r   r#   r   É   s    ÿzTerminator.__init__c                 C   s@   | j }d dd„ | jD ƒ¡}| jdd�}| d |||¡¡ d S )Nr)   c                 S   s   g | ]}d   |j| ¡ ¡‘qS ©rr   ©r5   r2   r*   r+   r   r   r#   r.   Ï   s   ÿz$Terminator.descr.<locals>.<listcomp>Tr/   rn   )r   r1   r   r3   r4   r5   )r   r6   r   r   r   r   r   r#   r7   Í   s    
ÿzTerminator.descrr   r   r   r!   r#   r€   È   s   r€   c                   @   s   e Zd Zdd„ ZdS )ÚPredictableInstrc                 C   sZ   t | jdƒg}|D ]*}|dk r&tdƒ‚| tt d¡|ƒ¡ q| j |¡}|  d|¡ d S )NZbranch_weightsr   z(branch weight must be a positive integeré    Zprof)	r	   r'   rZ   r4   r   r   ÚIntTyperv   Zset_metadata)r   Úweightsr   ÚwÚmdr   r   r#   Úset_weights×   s    zPredictableInstr.set_weightsN)r;   r=   r>   rŠ   r   r   r   r#   r„   Õ   s   r„   c                       s2   e Zd Zd‡ fdd„	Zedd„ ƒZdd„ Z‡  ZS )	ÚRetNc                    s*   |d k	r|gng }t t| ƒ |||¡ d S r$   )r   r‹   r   )r   r   r   Úreturn_valuer   r!   r   r#   r   â   s    zRet.__init__c                 C   s   | j r| j d S d S d S rh   ri   r&   r   r   r#   rŒ   æ   s    
zRet.return_valuec                 C   sR   | j }| jdd�}|d k	r:| d | j|j| ¡ |¡¡ n| d | j|¡¡ d S )NTr/   r0   z{0}{1}
)rŒ   r3   r4   r5   r   r2   r*   )r   r6   rŒ   r   r   r   r#   r7   í   s     ýz	Ret.descr)N)r;   r=   r>   r   r?   rŒ   r7   r@   r   r   r!   r#   r‹   á   s   
r‹   c                   @   s   e Zd ZdS )ÚBranchN©r;   r=   r>   r   r   r   r#   r�   ù   s   r�   c                   @   s   e Zd ZdS )ÚConditionalBranchNrŽ   r   r   r   r#   r�   ý   s   r�   c                       s8   e Zd Z‡ fdd„Zedd„ ƒZdd„ Zdd„ Z‡  ZS )	ÚIndirectBranchc                    s    t t| ƒ |||g¡ g | _d S r$   )r   r�   r   Údestinations)r   r   r   Úaddrr!   r   r#   r     s    zIndirectBranch.__init__c                 C   s
   | j d S rh   ri   r&   r   r   r#   Úaddress  s    zIndirectBranch.addressc                 C   s   t |tƒst‚| j |¡ d S r$   )r   r   r   r‘   r4   )r   Úblockr   r   r#   Úadd_destination
  s    zIndirectBranch.add_destinationc              
   C   sB   dd„ | j D ƒ}| d | jj| j ¡ d |¡| jdd�¡¡ d S )Nc                 S   s   g | ]}d   | ¡ ¡‘qS )z	label {0}©r5   r*   )r,   Úblkr   r   r#   r.     s   ÿz(IndirectBranch.descr.<locals>.<listcomp>zindirectbr {0} {1}, [{2}]  {3}
r)   Tr/   )r‘   r4   r5   r“   r2   r*   r1   r3   )r   r6   r‘   r   r   r#   r7     s    ÿ
üzIndirectBranch.descr)	r;   r=   r>   r   r?   r“   r•   r7   r@   r   r   r!   r#   r�     s
   
r�   c                       s8   e Zd Z‡ fdd„Zedd„ ƒZdd„ Zdd„ Z‡  ZS )	ÚSwitchInstrc                    s&   t t| ƒ |||g¡ || _g | _d S r$   )r   r˜   r   ÚdefaultÚcases)r   r   r   Úvalr™   r!   r   r#   r     s    zSwitchInstr.__init__c                 C   s
   | j d S rh   ri   r&   r   r   r#   Úvalue   s    zSwitchInstr.valuec                 C   s:   t |tƒst‚t |tƒs&t| jj|ƒ}| j ||f¡ d S r$   )	r   r   r   r   r   rœ   r2   rš   r4   )r   r›   r”   r   r   r#   Úadd_case$  s    
zSwitchInstr.add_casec                 C   sJ   dd„ | j D ƒ}| d | jj| j ¡ | j ¡ d |¡| jdd�¡¡ d S )Nc                 S   s(   g | ] \}}d   |j| ¡ | ¡ ¡‘qS )z{0} {1}, label {2}rƒ   ©r,   r›   r—   r   r   r#   r.   +  s   þÿz%SwitchInstr.descr.<locals>.<listcomp>z%switch {0} {1}, label {2} [{3}]  {4}
r(   Tr/   )	rš   r4   r5   rœ   r2   r*   r™   r1   r3   )r   r6   rš   r   r   r#   r7   *  s    þ
ûzSwitchInstr.descr)	r;   r=   r>   r   r?   rœ   r�   r7   r@   r   r   r!   r#   r˜     s
   
r˜   c                   @   s   e Zd ZdS )ÚResumeNrŽ   r   r   r   r#   rŸ   7  s   rŸ   c                       sJ   e Zd Zd‡ fdd„	Zedd„ ƒZedd„ ƒZed	d
„ ƒZdd„ Z‡  Z	S )ÚSelectInstrr   r   c                    s8   |j |j kst‚tt| ƒj||j d|||g||d� d S )NÚselect©r   r   )r2   r   r   r    r   )r   r   ÚcondÚlhsÚrhsr   r   r!   r   r#   r   <  s     þzSelectInstr.__init__c                 C   s
   | j d S rh   ri   r&   r   r   r#   r£   B  s    zSelectInstr.condc                 C   s
   | j d S rk   ri   r&   r   r   r#   r¤   F  s    zSelectInstr.lhsc                 C   s
   | j d S )Né   ri   r&   r   r   r#   r¥   J  s    zSelectInstr.rhsc                 C   sP   |  d d | j¡| jj| j ¡ | jj| j ¡ | jj| j ¡ | j	dd�¡¡ d S )Nz)select {0} {1} {2}, {3} {4}, {5} {6} {7}
r(   Tr/   )
r4   r5   r1   r   r£   r2   r*   r¤   r¥   r3   rz   r   r   r#   r7   N  s    
   
ûzSelectInstr.descr)r   r   )
r;   r=   r>   r   r?   r£   r¤   r¥   r7   r@   r   r   r!   r#   r    ;  s   


r    c                       s2   e Zd ZdZi Zdg f‡ fdd„	Zdd„ Z‡  ZS )ÚCompareInstrzinvalid-comparer   c           
         s¢   || j krtd|| jf ƒ‚|D ] }|| jkr td|| jf ƒ‚q | j}t|jtjƒrnt t d¡|jj	¡}	n
t d¡}	t
t| ƒj||	|||g||d� || _d S )Nzinvalid comparison %r for %szinvalid flag %r for %srP   )r   r   )ÚVALID_OPrZ   ÚOPNAMEÚ
VALID_FLAGr   r2   r   Ú
VectorTyper†   Úcountr   r§   r   r-   )
r   r   r-   r¤   r¥   r   r   Úflagr   r    r!   r   r#   r   ]  s     


  þzCompareInstr.__init__c                 C   s\   |  dj| jd dd„ | jD ƒ¡| j| jd j| jd  ¡ | jd  ¡ | j	dd�d	�¡ d S )
Nz.{opname}{flags} {op} {ty} {lhs}, {rhs} {meta}
r   c                 s   s   | ]}d | V  qdS )r(   Nr   )r,   Úitr   r   r#   Ú	<genexpr>p  s     z%CompareInstr.descr.<locals>.<genexpr>r   rP   Tr/   )r   r   r-   rw   r¤   r¥   rt   )
r4   r5   r   r1   r   r-   r   r2   r*   r3   rz   r   r   r#   r7   m  s    

ùzCompareInstr.descr)r;   r=   r>   r©   r¨   r   r7   r@   r   r   r!   r#   r§   X  s   r§   c                   @   s0   e Zd ZdZdddddddd	d
ddœ
Zeƒ ZdS )Ú	ICMPInstrZicmpÚequalz	not equalzunsigned greater thanzunsigned greater or equalzunsigned less thanzunsigned less or equalzsigned greater thanzsigned greater or equalzsigned less thanzsigned less or equal)
ÚeqÚneÚugtÚugeÚultÚuleZsgtZsgeZsltZsleN)r;   r=   r>   r©   r¨   Úsetrª   r   r   r   r#   r°   y  s   ör°   c                   @   sJ   e Zd ZdZdddddddd	d
ddddddddœZddddddddhZdS )Ú	FCMPInstrZfcmpz#no comparison, always returns falsezordered and equalzordered and greater thanz!ordered and greater than or equalzordered and less thanzordered and less than or equalzordered and not equalzordered (no nans)zunordered or equalzunordered or greater thanz"unordered or greater than or equalzunordered or less thanzunordered or less than or equalzunordered or not equalzunordered (either nans)z"no comparison, always returns true)ÚfalseZoeqZogtZogeZoltZoleÚoneÚordZueqr´   rµ   r¶   r·   ZuneZunoÚtruerH   rI   rJ   rK   rL   rM   rN   rG   N)r;   r=   r>   r©   r¨   rª   r   r   r   r#   r¹   Š  s*   ðÿr¹   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )Ú	CastInstrr   c                    s    t t| ƒj||||g|d� d S r   )r   r¾   r   )r   r   r-   r›   r    r   r!   r   r#   r   £  s    zCastInstr.__init__c                 C   s:   |  d | j| jd j| jd  ¡ | j| jdd�¡¡ d S )Nz{0} {1} {2} to {3} {4}
r   Tr/   )r4   r5   r   r   r2   r*   r3   rz   r   r   r#   r7   ¦  s    

ûzCastInstr.descr)r   r   r   r   r!   r#   r¾   ¢  s   r¾   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )Ú	LoadInstrr   c                    s*   t t| ƒj||jjd|g|d� d | _d S )NÚloadr   )r   r¿   r   r2   ÚpointeeÚalign)r   r   Úptrr   r!   r   r#   r   ²  s
     ÿzLoadInstr.__init__c                 C   sP   | j \}| jd k	rd| j }nd}| d |jj|j| ¡ || jdd�¡¡ d S )Nú
, align %dr   zload {0}, {1} {2}{3}{4}
Tr/   )r   rÂ   r4   r5   r2   rÁ   r*   r3   )r   r6   r›   rÂ   r   r   r#   r7   ·  s    

ûzLoadInstr.descr)r   r   r   r   r!   r#   r¿   °  s   r¿   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )Ú
StoreInstrc                    s"   t t| ƒ |t ¡ d||g¡ d S )NÚstore)r   rÅ   r   r   r�   )r   r   r›   rÃ   r!   r   r#   r   Ç  s    ÿzStoreInstr.__init__c                 C   sV   | j \}}| jd k	r d| j }nd}| d |j| ¡ |j| ¡ || jdd�¡¡ d S )NrÄ   r   zstore {0} {1}, {2} {3}{4}{5}
Tr/   )r   rÂ   r4   r5   r2   r*   r3   )r   r6   r›   rÃ   rÂ   r   r   r#   r7   Ë  s    


úzStoreInstr.descrr   r   r   r!   r#   rÅ   Æ  s   rÅ   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚLoadAtomicInstrr   c                    s0   t t| ƒj||jjd|g|d� || _|| _d S )Nzload atomicr   )r   rÇ   r   r2   rÁ   ÚorderingrÂ   )r   r   rÃ   rÈ   rÂ   r   r!   r   r#   r   Ü  s      ÿzLoadAtomicInstr.__init__c                 C   s<   | j \}| d |jj|j| ¡ | j| j| jdd�¡¡ d S )Nz+load atomic {0}, {1} {2} {3}, align {4}{5}
Tr/   )	r   r4   r5   r2   rÁ   r*   rÈ   rÂ   r3   )r   r6   r›   r   r   r#   r7   â  s    
úzLoadAtomicInstr.descr)r   r   r   r   r!   r#   rÇ   Û  s   rÇ   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚStoreAtomicInstrc                    s.   t t| ƒ |t ¡ d||g¡ || _|| _d S )Nzstore atomic)r   rÉ   r   r   r�   rÈ   rÂ   )r   r   r›   rÃ   rÈ   rÂ   r!   r   r#   r   ï  s     ÿzStoreAtomicInstr.__init__c                 C   sB   | j \}}| d |j| ¡ |j| ¡ | j| j| jdd�¡¡ d S )Nz0store atomic {0} {1}, {2} {3} {4}, align {5}{6}
Tr/   )r   r4   r5   r2   r*   rÈ   rÂ   r3   )r   r6   r›   rÃ   r   r   r#   r7   õ  s    

ùzStoreAtomicInstr.descrr   r   r   r!   r#   rÉ   î  s   rÉ   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚAllocaInstrc                    s4   |r
|gnd}t t| ƒ || ¡ d||¡ d | _d S )Nr   Zalloca)r   rÊ   r   Ú
as_pointerrÂ   )r   r   r    r¬   r   r   r!   r   r#   r     s     ÿzAllocaInstr.__init__c                 C   sv   |  d | j| jj¡¡ | jr>| j\}|  d |j| ¡ ¡¡ | jd k	rZ|  d | j¡¡ | jrr|  | j	dd�¡ d S )Nrr   z	, {0} {1}z, align {0}Tr/   )
r4   r5   r   r2   rÁ   r   r*   rÂ   r   r3   )r   r6   r-   r   r   r#   r7   	  s    
zAllocaInstr.descrr   r   r   r!   r#   rÊ     s   rÊ   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚGEPInstrc           
         sœ   |j }d }d}|D ]&}	|| |	¡ }}t|tjƒr|j}qt|tjƒsXt|tjƒrX|}n
| |¡}tt| ƒj	||d|gt
|ƒ |d� || _|| _|| _d S )Nr   Úgetelementptrr   )r2   Zgepr   r   ZPointerTypeZ	addrspacerË   r   rÌ   r   r   ÚpointerÚindicesÚinbounds)
r   r   rÃ   rÏ   rÐ   r   r    ZlasttypZlastaddrspacerd   r!   r   r#   r     s&    
ÿ
 ÿzGEPInstr.__init__c                 C   sZ   dd„ | j D ƒ}| jrdnd}| d || jjj| jj| j ¡ d |¡| j	dd�¡¡ d S )	Nc                 S   s   g | ]}d   |j| ¡ ¡‘qS r‚   rƒ   ©r,   rd   r   r   r#   r.   ,  s   ÿz"GEPInstr.descr.<locals>.<listcomp>zgetelementptr inboundsrÍ   z{0} {1}, {2} {3}, {4} {5}
r)   Tr/   )
rÏ   rÐ   r4   r5   rÎ   r2   rÁ   r*   r1   r3   )r   r6   rÏ   r-   r   r   r#   r7   +  s    ÿ
úzGEPInstr.descrr   r   r   r!   r#   rÌ     s   rÌ   c                       s6   e Zd Zd
‡ fdd„	Zdd„ Zdd„ Zdd	„ Z‡  ZS )ÚPhiInstrr   c                    s&   t t| ƒj||dd||d� g | _d S )NÚphir   r¢   )r   rÒ   r   Ú	incomings)r   r   r    r   r   r!   r   r#   r   :  s    ÿzPhiInstr.__init__c              
   C   sB   d  dd„ | jD ƒ¡}| d d  | j¡| j|| jdd�¡¡ d S )Nr)   c                 s   s&   | ]\}}d   | ¡ | ¡ ¡V  qdS )z
[{0}, {1}]Nr–   )r,   ÚvÚbr   r   r#   r¯   @  s   þ
ÿz!PhiInstr.descr.<locals>.<genexpr>zphi {0} {1} {2} {3}
r(   Tr/   )r1   rÔ   r4   r5   r   r2   r3   )r   r6   Zincsr   r   r#   r7   ?  s    
þ

üzPhiInstr.descrc                 C   s"   t |tƒst‚| j ||f¡ d S r$   )r   r   r   rÔ   r4   )r   rœ   r”   r   r   r#   Úadd_incomingJ  s    zPhiInstr.add_incomingc                    s   ‡ ‡fdd„| j D ƒ| _ d S )Nc                    s$   g | ]\}}|ˆkrˆ n||f‘qS r   r   rž   ©r9   r8   r   r#   r.   O  s   ÿz*PhiInstr.replace_usage.<locals>.<listcomp>)rÔ   )r   r8   r9   r   rØ   r#   r:   N  s    ÿzPhiInstr.replace_usage)r   )r;   r=   r>   r   r7   r×   r:   r@   r   r   r!   r#   rÒ   9  s   rÒ   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚExtractElementr   c                    sV   t |jtjƒstdƒ‚t |jtjƒs,tdƒ‚|jj}tt| ƒj	||d||g|d� d S )Nú!vector needs to be of VectorType.úindex needs to be of IntType.Zextractelementr   )
r   r2   r   r«   r^   r†   Úelementr   rÙ   r   )r   r   ÚvectorÚindexr   r    r!   r   r#   r   T  s     ÿzExtractElement.__init__c                 C   s0   d  dd„ | jD ƒ¡}| dj| j|d�¡ d S )Nr)   c                 s   s    | ]}d   |j| ¡ ¡V  qdS ©rr   Nrƒ   r+   r   r   r#   r¯   ^  s
   ÿ ÿz'ExtractElement.descr.<locals>.<genexpr>ú{opname} {operands}
©r   r   ©r1   r   r4   r5   r   ©r   r6   r   r   r   r#   r7   ]  s    
ÿ ÿzExtractElement.descr)r   r   r   r   r!   r#   rÙ   S  s   	rÙ   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚInsertElementr   c                    sz   t |jtjƒstdƒ‚|j|jjks:td |jj|j¡ƒ‚t |jtjƒsPtdƒ‚|j}tt	| ƒj
||d|||g|d� d S )NrÚ   z$value needs to be of type {} not {}.rÛ   Zinsertelementr   )r   r2   r   r«   r^   rÜ   r5   r†   r   rä   r   )r   r   rÝ   rœ   rÞ   r   r    r!   r   r#   r   e  s      ÿÿ ÿzInsertElement.__init__c                 C   s0   d  dd„ | jD ƒ¡}| dj| j|d�¡ d S )Nr)   c                 s   s    | ]}d   |j| ¡ ¡V  qdS rß   rƒ   r+   r   r   r#   r¯   s  s
   ÿ ÿz&InsertElement.descr.<locals>.<genexpr>rà   rá   râ   rã   r   r   r#   r7   r  s    
ÿ ÿzInsertElement.descr)r   r   r   r   r!   r#   rä   d  s   rä   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚShuffleVectorr   c                    sî   t |jtjƒstdƒ‚|tkr2|j|jkr2tdƒ‚t |tƒrht |jtjƒrht |jjtjƒrh|jjj	dksptdƒ‚t |jj|jj
¡}t|tkr–|jj
n
d|jj
 ƒ‰ t‡ fdd„|jD ƒƒsÊtd ˆ ¡ƒ‚tt| ƒj||d	|||g|d
� d S )Nz"vector1 needs to be of VectorType.z=vector2 needs to be Undefined or of the same type as vector1.r…   z'mask needs to be a constant i32 vector.r¦   c                 3   s   | ]}|j ˆ kV  qd S r$   )Úconstant)r,   Úii©Zindex_ranger   r#   r¯   Š  s     z)ShuffleVector.__init__.<locals>.<genexpr>zmask values need to be in {0}Zshufflevectorr   )r   r2   r   r«   r^   r   r   rÜ   r†   Úwidthr¬   r[   Úallræ   Ú
IndexErrorr5   r   rå   r   )r   r   Zvector1Zvector2Úmaskr   r    r!   rè   r#   r   z  s6    
ÿþýÿ

þÿ ÿzShuffleVector.__init__c                 C   s0   |  d d dd„ | jD ƒ¡| jdd�¡¡ d S )Nzshufflevector {0} {1}
r)   c                 s   s    | ]}d   |j| ¡ ¡V  qdS rß   rƒ   r+   r   r   r#   r¯   “  s   ÿz&ShuffleVector.descr.<locals>.<genexpr>Tr/   )r4   r5   r1   r   r3   rz   r   r   r#   r7   ‘  s    
ÿ
ýzShuffleVector.descr)r   r   r   r   r!   r#   rå   y  s   rå   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚExtractValuer   c              	      sz   |j }z|D ]}|j| }qW n. ttfk
rL   tdt|ƒ|j f ƒ‚Y nX tt| ƒj||d|g|d� || _	|| _
d S )NúCan't index at %r in %sZextractvaluer   )r2   ÚelementsÚAttributeErrorrë   r^   r   r   rí   r   Ú	aggregaterÏ   )r   r   ÚaggrÏ   r   r    rd   r!   r   r#   r   š  s    ÿ ÿzExtractValue.__init__c              
   C   sB   dd„ | j D ƒ}| d | jj| j ¡ d |¡| jdd�¡¡ d S )Nc                 S   s   g | ]}t |ƒ‘qS r   ©rS   rÑ   r   r   r#   r.   ª  s     z&ExtractValue.descr.<locals>.<listcomp>zextractvalue {0} {1}, {2} {3}
r)   Tr/   )rÏ   r4   r5   rñ   r2   r*   r1   r3   ©r   r6   rÏ   r   r   r#   r7   ©  s    
üzExtractValue.descr)r   r   r   r   r!   r#   rí   ™  s   rí   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚInsertValuer   c              	      sª   |j }z|D ]}|j| }qW n. ttfk
rL   tdt|ƒ|j f ƒ‚Y nX |j |krttd|t|ƒ|j |j f ƒ‚tt| ƒj||j d||g|d� || _	|| _
|| _d S )Nrî   z&Can only insert %s at %r in %s: got %sZinsertvaluer   )r2   rï   rð   rë   r^   r   r   rõ   r   rñ   rœ   rÏ   )r   r   rò   ÚelemrÏ   r   r    rd   r!   r   r#   r   µ  s&    ÿ
ÿ ÿzInsertValue.__init__c                 C   sP   dd„ | j D ƒ}| d | jj| j ¡ | jj| j ¡ d |¡| jdd�¡¡ d S )Nc                 S   s   g | ]}t |ƒ‘qS r   ró   rÑ   r   r   r#   r.   È  s     z%InsertValue.descr.<locals>.<listcomp>z&insertvalue {0} {1}, {2} {3}, {4} {5}
r)   Tr/   )	rÏ   r4   r5   rñ   r2   r*   rœ   r1   r3   rô   r   r   r#   r7   Ç  s      
üzInsertValue.descr)r   r   r   r   r!   r#   rõ   ´  s   rõ   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚUnreachablec                    s"   t t| ƒj|t ¡ dddd� d S )NZunreachabler   r   r   )r   r÷   r   r   r�   )r   r   r!   r   r#   r   Ó  s
      ÿzUnreachable.__init__c                 C   s   || j df7 }d S )NÚ
)r   rz   r   r   r#   r7   ×  s    zUnreachable.descrr   r   r   r!   r#   r÷   Ò  s   r÷   c                   @   s.   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
S )Ú	InlineAsmFc                 C   s$   |j | _|| _|| _|| _|| _d S r$   )r_   r2   r\   ÚasmÚ
constraintÚside_effect)r   Zftyperú   rû   rü   r   r   r#   r   Ü  s
    zInlineAsm.__init__c                 C   s0   | j r
dnd}d}| |j|| j| jd�¡ d S )NÚ
sideeffectr   z)asm {sideeffect} "{asm}", "{constraint}"
)rý   rú   rû   )rü   r4   r5   rú   rû   )r   r6   rý   Úfmtr   r   r#   r7   ã  s
    ÿzInlineAsm.descrc                 C   s   g }|   |¡ d |¡S )Nr   )r7   r1   rz   r   r   r#   r*   é  s    
zInlineAsm.get_referencec                 C   s   d  | j|  ¡ ¡S )Nrr   rƒ   r&   r   r   r#   Ú__str__î  s    zInlineAsm.__str__N)F)r;   r=   r>   r   r7   r*   rÿ   r   r   r   r#   rù   Û  s   
rù   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )Ú	AtomicRMWc                    s0   t t| ƒj||jd||f|d� || _|| _d S )NZ	atomicrmwr   )r   r   r   r2   Ú	operationrÈ   )r   r   r-   rÃ   r›   rÈ   r   r!   r   r#   r   ó  s     ÿzAtomicRMW.__init__c                 C   sH   | j \}}d}| |j| j|j| ¡ |j| ¡ | j| jdd�d�¡ d S )NzBatomicrmw {op} {ptrty} {ptr}, {valty} {val} {ordering} {metadata}
Tr/   )r-   ÚptrtyrÃ   Zvaltyr›   rÈ   r   )r   r4   r5   r  r2   r*   rÈ   r3   )r   r6   rÃ   r›   rþ   r   r   r#   r7   ù  s    
ÿúzAtomicRMW.descrr   r   r   r!   r#   r   ò  s   r   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚCmpXchgzdThis instruction has changed since llvm3.5.  It is not compatible with
    older llvm versions.
    c           	         sF   t  |jt  d¡g¡}tt| ƒj||d|||f|d� || _|| _d S )NrP   Zcmpxchgr   )	r   ZLiteralStructTyper2   r†   r   r  r   rÈ   Úfailordering)	r   r   rÃ   Úcmpr›   rÈ   r  r   Zouttyper!   r   r#   r     s     ÿzCmpXchg.__init__c                 C   sP   | j \}}}d}| |j|j| ¡ |j| ¡ | ¡ | j| j| jdd�d�¡ d S )NzScmpxchg {ptrty} {ptr}, {ty} {cmp}, {ty} {val} {ordering} {failordering} {metadata}
Tr/   )r  rÃ   rw   r  r›   rÈ   r  r   )r   r4   r5   r2   r*   rÈ   r  r3   )r   r6   rÃ   Zcmpvalr›   rþ   r   r   r#   r7     s    ÿùzCmpXchg.descr)r;   r=   r>   Ú__doc__r   r7   r@   r   r   r!   r#   r    s   r  c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_LandingPadClausec                 C   s
   || _ d S r$   )rœ   ©r   rœ   r   r   r#   r   %  s    z_LandingPadClause.__init__c                 C   s   dj | j| jj| j ¡ d�S )Nz{kind} {type} {value})Úkindr2   rœ   )r5   r	  rœ   r2   r*   r&   r   r   r#   rÿ   (  s
    ýz_LandingPadClause.__str__N)r;   r=   r>   r   rÿ   r   r   r   r#   r  $  s   r  c                   @   s   e Zd ZdZdS )ÚCatchClauseZcatchN)r;   r=   r>   r	  r   r   r   r#   r
  /  s   r
  c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚFilterClauseÚfilterc                    s4   t |tƒst‚t |jtjƒs t‚tt| ƒ |¡ d S r$   )	r   r   r   r2   r   Ú	ArrayTyper   r  r   r  r!   r   r#   r   6  s    zFilterClause.__init__)r;   r=   r>   r	  r   r@   r   r   r!   r#   r  3  s   r  c                       s.   e Zd Zd	‡ fdd„	Zdd„ Zdd„ Z‡  ZS )
ÚLandingPadInstrr   Fc                    s*   t t| ƒj||dg |d� || _g | _d S )NZ
landingpadr   )r   r  r   ÚcleanupÚclauses)r   r   r    r   r  r!   r   r#   r   =  s
    ÿzLandingPadInstr.__init__c                 C   s   t |tƒst‚| j |¡ d S r$   )r   r  r   r  r4   )r   Úclauser   r   r#   Ú
add_clauseC  s    zLandingPadInstr.add_clausec              	   C   s<   d}|  |j| j| jrdndd dd„ | jD ƒ¡d�¡ d S )Nz$landingpad {type}{cleanup}{clauses}
z cleanupr   c                 S   s   g | ]}d   |¡‘qS )z

      {0})r5   )r,   r  r   r   r#   r.   K  s   ÿz)LandingPadInstr.descr.<locals>.<listcomp>)r2   r  r  )r4   r5   r2   r  r1   r  )r   r6   rþ   r   r   r#   r7   G  s    
ÿþzLandingPadInstr.descr)r   F)r;   r=   r>   r   r  r7   r@   r   r   r!   r#   r  <  s   r  c                       s6   e Zd ZdZddddhZd‡ fdd	„	Zd
d„ Z‡  ZS )ÚFencez|
    The `fence` instruction.

    As of LLVM 5.0.1:

    fence [syncscope("<target-scope>")] <ordering>  ; yields void
    ÚacquireÚreleaseZacq_relZseq_cstNr   c                    sT   t t| ƒj|t ¡ dd|d� || jkrDd}t| |d | j¡¡ƒ‚|| _	|| _
d S )NZfencer   r   z3Invalid fence ordering "{0}"! Should be one of {1}.r)   )r   r  r   r   r�   ÚVALID_FENCE_ORDERINGSrZ   r5   r1   rÈ   Útargetscope)r   r   rÈ   r  r   rg   r!   r   r#   r   [  s    ÿ

ÿzFence.__init__c                 C   s:   | j d krd}nd | j ¡}d}| |j|| jd�¡ d S )Nr   zsyncscope("{0}") zfence {syncscope}{ordering}
)Ú	syncscoperÈ   )r  r5   r4   rÈ   )r   r6   r  rþ   r   r   r#   r7   e  s    

ÿzFence.descr)Nr   )r;   r=   r>   r  r  r   r7   r@   r   r   r!   r#   r  P  s   
r  N):r  Zllvmlite.irr   Zllvmlite.ir.valuesr   r   r   r   r   r   r	   r
   r   r   Zllvmlite.ir._utilsr   r   rA   rD   rT   rF   rO   r|   r€   r„   r‹   r�   r�   r�   r˜   rŸ   r    r§   r°   r¹   r¾   r¿   rÅ   rÇ   rÉ   rÊ   rÌ   rÒ   rÙ   rä   rå   rí   rõ   r÷   Úobjectrù   r   r  r  r
  r  r  r  r   r   r   r#   Ú<module>   sV   0*p!% 		