U
    ¤½|eŒ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   úU/var/www/website-v5/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©Ú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   r5   r   Ú_clear_string_cache)r   ÚoldÚnewÚ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   r3   r   r   r&   r   r   r#   Ú__repr__0   s       þzInstruction.__repr__)r   r   )r>   Ú
__module__Ú__qualname__r   Úpropertyr%   r'   r8   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 )ÚCallInstrAttributesÚnoreturnÚnounwindÚreadonlyÚreadnoneÚnoinlineÚalwaysinlineN©r>   r@   rA   Ú	frozensetÚ_knownr   r   r   r#   rD   6   s   
 ÿrD   Ú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ÚreassocNrK   r   r   r   r#   rO   >   s    ÿrO   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 )	NrN   r   r   zInvalid argument index {}z%Type of #{0} arg mismatch: {1} != {2}é   Úcallr   )r   r   Úcalling_conventionÚcconvÚstrÚTailMarkerOptionsrN   rO   ÚfastmathrD   Ú
attributesÚarg_attributesÚitemsÚlenÚ
ValueErrorr6   r   r   ÚrangeÚfunction_typeÚargsr   ÚMetaDataTyper3   r   Ú	TypeErrorr   rX   r   Úreturn_type)r   r   Úfuncrg   r   r\   rN   r_   ÚattrsÚ	arg_attrsÚidxÚiÚargZ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 rr   rs   )r   Z	newcalleer   r   r#   rt   s   s    c                 C   s   | j dd … S ©NrY   rs   r&   r   r   r#   rg   w   s    zCallInstr.argsc                 C   s    |j | jj krtdƒ‚|| _d S )Nz"New function has incompatible type)rf   rt   ri   )r   Únewfuncr   r   r#   Úreplace_callee{   s    zCallInstr.replace_calleec                 C   s   | j S )zThe callee function)rt   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})ra   r2   Ú_to_listr3   r6   r*   )ro   Úarl   r&   r   r#   Ú	descr_arg†   s    
z#CallInstr._descr.<locals>.descr_argr)   c                    s   g | ]\}}ˆ ||ƒ‘qS r   r   )r,   ro   r{   )r|   r   r#   r.   Œ   s     z$CallInstr._descr.<locals>.<listcomp>ú{0} {1}r   z{0} r(   z2{tail}{op}{fastmath} {callee}({args}){attr}{meta}
Tr/   )rN   r-   rt   r_   rg   ÚattrÚmeta)r2   Ú	enumeraterg   rt   rf   Úvar_argrj   r6   r*   r\   rN   r`   rz   r_   r5   r   r4   )
r   r7   Úadd_metadatarg   ÚfntyÚtyZ
callee_refZtail_markerZfn_attrsZfm_attrsr   )r|   r   r#   Ú_descr…   s>    ÿÿÿÿÿøzCallInstr._descrc                 C   s   | j |dd� d S )NT©r‚   )r…   ©r   r7   r   r   r#   r8   ¯   s    zCallInstr.descr)r   NNr   r   N)r>   r@   rA   r   rB   rt   Úsetterrg   rw   rx   r…   r8   rC   r   r   r!   r#   rX   C   s          ÿ+



*rX   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)rN   r_   rl   rm   Úinvoke)	r   r   r   r   r‰   r   r   Ú	normal_toÚ	unwind_to)r   r   rk   rg   r‹   rŒ   r   r\   r_   rl   rm   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 )NFr†   z.      to label {0} unwind label {1}{metadata}
Tr/   )r   )	r   r‰   r…   r5   r6   r‹   r*   rŒ   r4   r‡   r!   r   r#   r8   ¿   s    
ýzInvokeInstr.descr)r   Nr   r   N©r>   r@   rA   r   r8   rC   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 ©r}   ©r6   r3   r*   r+   r   r   r#   r.   Ï   s   ÿz$Terminator.descr.<locals>.<listcomp>Tr/   ry   )r   r2   r   r4   r5   r6   )r   r7   r   r   r   r   r   r#   r8   Í   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'   rd   r5   r   r   ÚIntTyper‚   Úset_metadata)r   Úweightsr   ÚwÚmdr   r   r#   Úset_weights×   s    zPredictableInstr.set_weightsN)r>   r@   rA   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 rr   rs   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/   r1   z{0}{1}
)r›   r4   r5   r6   r   r3   r*   )r   r7   r›   r   r   r   r#   r8   í   s     ýz	Ret.descr)N)r>   r@   rA   r   rB   r›   r8   rC   r   r   r!   r#   rš   á   s   
rš   c                   @   s   e Zd ZdS )ÚBranchN©r>   r@   rA   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 rr   rs   r&   r   r   r#   Úaddress  s    zIndirectBranch.addressc                 C   s   t |tƒst‚| j |¡ d S r$   )r   r   r   r    r5   )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}©r6   r*   )r,   Úblkr   r   r#   r.     s   ÿz(IndirectBranch.descr.<locals>.<listcomp>zindirectbr {0} {1}, [{2}]  {3}
r)   Tr/   )r    r5   r6   r¢   r3   r*   r2   r4   )r   r7   r    r   r   r#   r8     s    ÿ
üzIndirectBranch.descr)	r>   r@   rA   r   rB   r¢   r¤   r8   rC   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 rr   rs   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«   r3   r©   r5   )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©   r5   r6   r«   r3   r*   r¨   r2   r4   )r   r7   r©   r   r   r#   r8   *  s    þ
ûzSwitchInstr.descr)	r>   r@   rA   r   rB   r«   r¬   r8   rC   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   )r3   r   r   r¯   r   )r   r   ÚcondÚlhsÚrhsr   r   r!   r   r#   r   <  s     þzSelectInstr.__init__c                 C   s
   | j d S rr   rs   r&   r   r   r#   r²   B  s    zSelectInstr.condc                 C   s
   | j d S ru   rs   r&   r   r   r#   r³   F  s    zSelectInstr.lhsc                 C   s
   | j d S )Né   rs   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/   )
r5   r6   r2   r   r²   r3   r*   r³   r´   r4   r‡   r   r   r#   r8   N  s    
   
ûzSelectInstr.descr)r   r   )
r>   r@   rA   r   rB   r²   r³   r´   r8   rC   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 %srY   )r   r   )ÚVALID_OPrd   ÚOPNAMEÚ
VALID_FLAGr   r3   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   rY   Tr/   )r   r   r-   r„   r³   r´   r   )
r5   r6   r   r2   r   r-   r   r3   r*   r4   r‡   r   r   r#   r8   m  s    

ùzCompareInstr.descr)r>   r@   rA   r¸   r·   r   r8   rC   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@   rA   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ÚtruerQ   rR   rS   rT   rU   rV   rW   rP   N)r>   r@   rA   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/   )r5   r6   r   r   r3   r*   r4   r‡   r   r   r#   r8   ¦  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   r3   Ú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Ñ   r5   r6   r3   rÐ   r*   r4   )r   r7   rª   rÑ   r   r   r#   r8   ·  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Ñ   r5   r6   r3   r*   r4   )r   r7   rª   rÒ   rÑ   r   r   r#   r8   Ë  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   r3   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   r5   r6   r3   rÐ   r*   r×   rÑ   r4   )r   r7   rª   r   r   r#   r8   â  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   r5   r6   r3   r*   r×   rÑ   r4   )r   r7   rª   rÒ   r   r   r#   r8   õ  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   Ú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 )Nr}   z	, {0} {1}z, align {0}Tr/   )
r5   r6   r   r3   rÐ   r   r*   rÑ   r   r4   )r   r7   r-   r   r   r#   r8   	  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   )r3   Úgepr   r   ÚPointerTypeÚ	addrspacerÛ   r   rÜ   r   r   ÚpointerÚindicesÚinbounds)
r   r   rÒ   râ   rã   r   r    ZlasttypZlastaddrspacero   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,   ro   r   r   r#   r.   ,  s   ÿz"GEPInstr.descr.<locals>.<listcomp>zgetelementptr inboundsrÝ   z{0} {1}, {2} {3}, {4} {5}
r)   Tr/   )
râ   rã   r5   r6   rá   r3   rÐ   r*   r2   r4   )r   r7   râ   r-   r   r   r#   r8   +  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/   )r2   rç   r5   r6   r   r3   r4   )r   r7   Zincsr   r   r#   r8   ?  s    
þ

üzPhiInstr.descrc                 C   s"   t |tƒst‚| j ||f¡ d S r$   )r   r   r   rç   r5   )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­   ©r;   r:   r   r#   r.   O  s   ÿz*PhiInstr.replace_usage.<locals>.<listcomp>)rç   )r   r:   r;   r   rë   r#   r=   N  s    ÿzPhiInstr.replace_usage)r   )r>   r@   rA   r   r8   rê   r=   rC   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   r3   r   rº   ri   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 ©r}   Nr‘   r+   r   r   r#   r¾   ^  s
   ÿ ÿz'ExtractElement.descr.<locals>.<genexpr>ú{opname} {operands}
©r   r   ©r2   r   r5   r6   r   ©r   r7   r   r   r   r#   r8   ]  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   r3   r   rº   ri   rï   r6   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#   r8   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   r3   r   rº   ri   r   r   rï   r”   Úwidthr»   re   Úallrù   Ú
IndexErrorr6   r   rø   r   )r   r   Úvector1Ú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/   )r5   r6   r2   r   r4   r‡   r   r   r#   r8   ‘  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   )r3   ÚelementsÚAttributeErrorrþ   ri   r   r   r  r   Ú	aggregaterâ   )r   r   Úaggrâ   r   r    ro   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   ©r]   rä   r   r   r#   r.   ª  s     z&ExtractValue.descr.<locals>.<listcomp>zextractvalue {0} {1}, {2} {3}
r)   Tr/   )râ   r5   r6   r  r3   r*   r2   r4   ©r   r7   râ   r   r   r#   r8   ©  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   )r3   r  r  rþ   ri   r   r   r
  r   r  r«   râ   )r   r   r  Úelemrâ   r   r    ro   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â   r5   r6   r  r3   r*   r«   r2   r4   r	  r   r   r#   r8   Ç  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 )NÚ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   r‡   r   r   r#   r8   ×  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$   )rj   r3   rf   ÚasmÚ
constraintÚside_effect)r   Ú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  r5   r6   r  r  )r   r7   r  Úfmtr   r   r#   r8   ã  s
    ÿzInlineAsm.descrc                 C   s   g }|   |¡ d |¡S )Nr   )r8   r2   r‡   r   r   r#   r*   é  s    
zInlineAsm.get_referencec                 C   s   d  | j|  ¡ ¡S )Nr}   r‘   r&   r   r   r#   Ú__str__î  s    zInlineAsm.__str__N)F)r>   r@   rA   r   r8   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   r3   Ú	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Ò   Úvaltyrª   r×   r   )r   r5   r6   r  r3   r*   r×   r4   )r   r7   rÒ   rª   r  r   r   r#   r8   ù  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 )NrY   Úcmpxchgr   )	r   ÚLiteralStructTyper3   r”   r   r  r   r×   Úfailordering)	r   r   rÒ   Úcmprª   r×   r  r   Ú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Ò   r„   r  rª   r×   r  r   )r   r5   r6   r3   r*   r×   r  r4   )r   r7   rÒ   Zcmpvalrª   r  r   r   r#   r8     s    ÿùzCmpXchg.descr)r>   r@   rA   Ú__doc__r   r8   rC   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})Úkindr3   r«   )r6   r$  r«   r3   r*   r&   r   r   r#   r  (  s
    ýz_LandingPadClause.__str__N)r>   r@   rA   r   r  r   r   r   r#   r"  $  s   r"  c                   @   s   e Zd ZdZdS )ÚCatchClauseZcatchN)r>   r@   rA   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   r3   r   Ú	ArrayTyper   r&  r   r#  r!   r   r#   r   6  s    zFilterClause.__init__)r>   r@   rA   r$  r   rC   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 )NÚ
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,  r5   )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})r6   )r,   r-  r   r   r#   r.   K  s   ÿz)LandingPadInstr.descr.<locals>.<listcomp>)r3   r+  r,  )r5   r6   r3   r+  r2   r,  )r   r7   r  r   r   r#   r8   G  s    
ÿþzLandingPadInstr.descr)r   F)r>   r@   rA   r   r.  r8   rC   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 )NÚfencer   r   z3Invalid fence ordering "{0}"! Should be one of {1}.r)   )r   r/  r   r   r�   ÚVALID_FENCE_ORDERINGSrd   r6   r2   r×   Útargetscope)r   r   r×   r4  r   rq   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×   )r4  r6   r5   r×   )r   r7   r5  r  r   r   r#   r8   e  s    

ÿzFence.descr)Nr   )r>   r@   rA   r!  r3  r   r8   rC   r   r   r!   r#   r/  P  s   
r/  N):r!  Úllvmlite.irr   Zllvmlite.ir.valuesr   r   r   r   r   r   r	   r
   r   r   Úllvmlite.ir._utilsr   r   rD   rL   r^   rO   rX   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!% 		