B
    Ꮚ\or                 @   s  d Z ddlmZm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 ddlm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 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 d/d0 d0eZ&G d1d2 d2eZ'G d3d4 d4eZ(G d5d6 d6eZ)G d7d8 d8eZ*G d9d: d:eZ+G d;d< d<eZ,G d=d> d>eZ-G d?d@ d@eZ.G dAdB dBeZ/G dCdD dDeZ0G dEdF dFe1Z2G dGdH dHeZ3G dIdJ dJeZ4G dKdL dLe1Z5G dMdN dNe5Z6G dOdP dPe5Z7G dQdR dReZ8G dSdT dTeZ9dUS )Vz)
Implementation of LLVM IR instructions.
    )print_functionabsolute_import   )types)	BlockFunctionValue
NamedValueConstantMetaDataArgumentMetaDataStringAttributeSet	Undefined)_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   7lib/python3.7/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 )N)r   r#   module)r   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 z, c             S   s   g | ]}|  qS r   )get_reference).0opr   r   r"   
<listcomp>#   s    z%Instruction.descr.<locals>.<listcomp>T)leading_commaz{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   sJ   || j krFg }x$| j D ]}|||kr*|n| qW t|| _ |   d S )N)r   r.   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   r,   r   r   )r   r   r   r"   __repr__1   s    zInstruction.__repr__)r   r   )r5   
__module____qualname__r   propertyr#   r$   r1   r4   r6   __classcell__r   r   )r!   r"   r      s   	
r   c               @   s   e Zd ZeddddgZdS )CallInstrAttributesZnoreturnZnounwindreadonlyZreadnoneN)r5   r7   r8   	frozenset_knownr   r   r   r"   r;   7   s   r;   c               @   s   e Zd ZedddddgZdS )FastMathFlagsfastnnanninfnszarcpN)r5   r7   r8   r=   r>   r   r   r   r"   r?   ;   s   r?   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   NFr   c                s   |d krt |tr|jn|| _|| _t|| _t | _t	|}xxt
t|jjD ]d}|| }	|jj| }
t |
tjr|	j|
krt|	}	|	j|
krdd| |
|	j}t||	||< qPW tt| j||jjd|gt	| |d d S )Nz%Type of #{0} arg mismatch: {1} != {2}r   Zcall)r   )r   r   Zcalling_conventioncconvtailr?   fastmathr;   
attributesr   rangelenfunction_typeargsr   ZMetaDataTyper,   r   r/   	TypeErrorr   rE   r   return_type)r   r   funcrM   r   rF   rG   rH   iargZexpected_typemsg)r!   r   r"   r   @   s&    


zCallInstr.__init__c             C   s
   | j d S )Nr   )r   )r   r   r   r"   calleeZ   s    zCallInstr.calleec             C   s   || j d< d S )Nr   )r   )r   Z	newcalleer   r   r"   rT   ^   s    c             C   s   | j dd  S )Nr   )r   )r   r   r   r"   rM   b   s    zCallInstr.argsc             C   s    |j | jj krtd|| _d S )Nz"New function has incompatible type)rL   rT   rN   )r   Znewfuncr   r   r"   replace_calleef   s    zCallInstr.replace_calleec             C   s   | j S )zAlias for llvmpy)rT   )r   r   r   r"   called_functionk   s    zCallInstr.called_functionc             C   s   d dd | jD }| jj}|jr*|}n|j}d|| j }| jrVd| j|}|	dj| j
rhdnd| j|d dd | jD |d d	d | jD |r| jd
dndd d S )Nz, c             S   s   g | ]}d  |j| qS )z{0} {1})r/   r,   r&   )r'   ar   r   r"   r)   q   s   z$CallInstr._descr.<locals>.<listcomp>z{0} {1}z2{tail}{op}{fastmath} {callee}({args}){attr}{meta}
ztail r   c             S   s   g | ]}d | qS )r%   r   )r'   attrr   r   r"   r)      s    c             S   s   g | ]}d | qS )r%   r   )r'   rX   r   r   r"   r)      s    T)r*   )rG   r(   rT   rH   rM   rX   meta)r+   rM   rT   rL   Zvar_argrO   r/   r&   rF   r.   rG   r   rH   rI   r-   )r   r0   add_metadatarM   ZfntytyZ
callee_refr   r   r"   _descrp   s"    
zCallInstr._descrc             C   s   | j |dd d S )NT)rZ   )r\   )r   r0   r   r   r"   r1      s    zCallInstr.descr)r   NFr   )r5   r7   r8   r   r9   rT   setterrM   rU   rV   r\   r1   r:   r   r   )r!   r"   rE   ?   s    rE   c                   s*   e Zd Zd fdd	Z fddZ  ZS )InvokeInstrr   Nc                sJ   t |tstt |tsttt| ||||| d| _|| _|| _d S )NZinvoke)	r   r   r   r   r^   r   r   	normal_to	unwind_to)r   r   rP   rM   r_   r`   r   rF   )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 )NF)rZ   z.      to label {0} unwind label {1}{metadata}
T)r*   )r   )	r   r^   r\   r.   r/   r_   r&   r`   r-   )r   r0   )r!   r   r"   r1      s
    zInvokeInstr.descr)r   N)r5   r7   r8   r   r1   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 )N)r   ra   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 )Nz, c             S   s   g | ]}d  |j| qS )z{0} {1})r/   r,   r&   )r'   r(   r   r   r"   r)      s   z$Terminator.descr.<locals>.<listcomp>T)r*   z
{0} {1}{2})r   r+   r   r-   r.   r/   )r   r0   r   r   r   r   r   r"   r1      s
    
zTerminator.descr)r5   r7   r8   r   r1   r:   r   r   )r!   r"   ra      s   ra   c               @   s   e Zd Zdd ZdS )PredictableInstrc             C   s^   t | jdg}x2|D ]*}|dk r(td|ttd| qW | j|}| d| d S )NZbranch_weightsr   z(branch weight must be a positive integer    Zprof)	r   r$   
ValueErrorr.   r
   r   IntTyperZ   Zset_metadata)r   Zweightsr   wZmdr   r   r"   set_weights   s    
zPredictableInstr.set_weightsN)r5   r7   r8   rh   r   r   r   r"   rc      s   rc   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 )N)r   ri   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 )Nr   )r   )r   r   r   r"   rj      s    
zRet.return_valuec             C   sR   | j }| jdd}|d k	r:|d| j|j| | n|d| j| d S )NT)r*   z{0} {1} {2}{3}
z{0}{1}
)rj   r-   r.   r/   r   r,   r&   )r   r0   rj   r   r   r   r"   r1      s    
z	Ret.descr)N)r5   r7   r8   r   r9   rj   r1   r:   r   r   )r!   r"   ri      s   ri   c               @   s   e Zd ZdS )BranchN)r5   r7   r8   r   r   r   r"   rk      s   rk   c               @   s   e Zd ZdS )ConditionalBranchN)r5   r7   r8   r   r   r   r"   rl      s   rl   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 )N)r   rm   r   destinations)r   r   r   Zaddr)r!   r   r"   r      s    zIndirectBranch.__init__c             C   s
   | j d S )Nr   )r   )r   r   r   r"   address   s    zIndirectBranch.addressc             C   s   t |tst| j| d S )N)r   r   r   rn   r.   )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})r/   r&   )r'   blkr   r   r"   r)      s   z(IndirectBranch.descr.<locals>.<listcomp>zindirectbr {0} {1}, [{2}]  {3}
z, T)r*   )rn   r.   r/   ro   r,   r&   r+   r-   )r   r0   rn   r   r   r"   r1      s    
zIndirectBranch.descr)	r5   r7   r8   r   r9   ro   rq   r1   r:   r   r   )r!   r"   rm      s   rm   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 )N)r   rs   r   defaultcases)r   r   r   valrt   )r!   r   r"   r      s    zSwitchInstr.__init__c             C   s
   | j d S )Nr   )r   )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 )N)	r   r   r   r   r
   rw   r,   ru   r.   )r   rv   rp   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'   rv   rr   r   r   r"   r)     s   z%SwitchInstr.descr.<locals>.<listcomp>z%switch {0} {1}, label {2} [{3}]  {4}
r%   T)r*   )	ru   r.   r/   rw   r,   r&   rt   r+   r-   )r   r0   ru   r   r   r"   r1     s    
zSwitchInstr.descr)	r5   r7   r8   r   r9   rw   rx   r1   r:   r   r   )r!   r"   rs      s   rs   c               @   s   e Zd ZdS )ResumeN)r5   r7   r8   r   r   r   r"   ry     s   ry   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   c                s6   |j |j ksttt| j||j d|||g|d d S )NZselect)r   )r,   r   r   rz   r   )r   r   condlhsrhsr   )r!   r   r"   r     s    zSelectInstr.__init__c             C   s
   | j d S )Nr   )r   )r   r   r   r"   r{     s    zSelectInstr.condc             C   s
   | j d S )Nr   )r   )r   r   r   r"   r|     s    zSelectInstr.lhsc             C   s
   | j d S )N   )r   )r   r   r   r"   r}   !  s    zSelectInstr.rhsc             C   sF   | d| jj| j | jj| j | jj| j | jdd d S )Nz%select {0} {1}, {2} {3}, {4} {5} {6}
T)r*   )r.   r/   r{   r,   r&   r|   r}   r-   )r   r0   r   r   r"   r1   %  s
    zSelectInstr.descr)r   )
r5   r7   r8   r   r9   r{   r|   r}   r1   r:   r   r   )r!   r"   rz     s
   rz   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 x(|D ] }|| jkr"td|| jf q"W | j}t|jtjrrttd|jj	}	n
td}	t
t| j||	|||g||d || _d S )Nzinvalid comparison %r for %szinvalid flag %r for %sr   )r   r   )VALID_OPre   OPNAME
VALID_FLAGr   r,   r   
VectorTyperf   countr   r   r   r(   )
r   r   r(   r|   r}   r   r   flagr   r    )r!   r   r"   r   3  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>F  s    z%CompareInstr.descr.<locals>.<genexpr>r   r   T)r*   )r   r   r(   r[   r|   r}   rY   )
r.   r/   r   r+   r   r(   r   r,   r&   r-   )r   r0   r   r   r"   r1   C  s    
zCompareInstr.descr)r5   r7   r8   r   r   r   r1   r:   r   r   )r!   r"   r   .  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icmpZ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)r5   r7   r8   r   r   setr   r   r   r   r"   r   O  s   r   c               @   sD   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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)ZfalseZoeqZogtZogeZoltZoleZoneordZueqr   r   r   r   ZuneZunotruerA   rB   rC   rD   r@   N)r5   r7   r8   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 )N)r   )r   r   r   )r   r   r(   rv   r    r   )r!   r   r"   r   x  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   T)r*   )r.   r/   r   r   r,   r&   r-   )r   r0   r   r   r"   r1   {  s    
zCastInstr.descr)r   )r5   r7   r8   r   r1   r:   r   r   )r!   r"   r   w  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load)r   )r   r   r   r,   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 )Nz
, align %dr   zload {0}, {1} {2}{3}{4}
T)r*   )r   r   r.   r/   r,   r   r&   r-   )r   r0   rv   r   r   r   r"   r1     s    
zLoadInstr.descr)r   )r5   r7   r8   r   r1   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 )NZstore)r   r   r   r   rb   )r   r   rv   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 )Nz
, align %dr   zstore {0} {1}, {2} {3}{4}{5}
T)r*   )r   r   r.   r/   r,   r&   r-   )r   r0   rv   r   r   r   r   r"   r1     s    

zStoreInstr.descr)r5   r7   r8   r   r1   r:   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 atomic)r   )r   r   r   r,   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}
T)r*   )	r   r.   r/   r,   r   r&   r   r   r-   )r   r0   rv   r   r   r"   r1     s    zLoadAtomicInstr.descr)r   )r5   r7   r8   r   r1   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   rb   r   r   )r   r   rv   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}
T)r*   )r   r.   r/   r,   r&   r   r   r-   )r   r0   rv   r   r   r   r"   r1     s    
zStoreAtomicInstr.descr)r5   r7   r8   r   r1   r:   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 )Nz{0} {1}z	, {0} {1}z, align {0}T)r*   )
r.   r/   r   r,   r   r   r&   r   r   r-   )r   r0   r(   r   r   r"   r1     s    
zAllocaInstr.descr)r5   r7   r8   r   r1   r:   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}x.|D ]&}	|||	 }}t|tjr|j}qW t|tjs\t|tjr\|}n
||}tt| j	||d|gt
| |d || _|| _|| _d S )Nr   getelementptr)r   )r,   Zgepr   r   ZPointerTypeZ	addrspacer   r   r   r   r   pointerindicesinbounds)
r   r   r   r   r   r   r    ZlasttypZlastaddrspacerQ   )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 )z{0} {1})r/   r,   r&   )r'   rQ   r   r   r"   r)     s   z"GEPInstr.descr.<locals>.<listcomp>zgetelementptr inboundsr   z{0} {1}, {2} {3}, {4} {5}
z, T)r*   )
r   r   r.   r/   r   r,   r   r&   r+   r-   )r   r0   r   r(   r   r   r"   r1      s    
zGEPInstr.descr)r5   r7   r8   r   r1   r:   r   r   )r!   r"   r     s   r   c                   s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	PhiInstrc                s$   t t| j||dd|d g | _d S )NZphir   )r   )r   r   r   	incomings)r   r   r    r   )r!   r   r"   r     s    zPhiInstr.__init__c          	   C   s8   d dd | jD }|d| j|| jdd d S )Nz, c             s   s&   | ]\}}d  | | V  qdS )z
[{0}, {1}]N)r/   r&   )r'   vbr   r   r"   r     s   z!PhiInstr.descr.<locals>.<genexpr>zphi {0} {1} {2}
T)r*   )r+   r   r.   r/   r,   r-   )r   r0   Zincsr   r   r"   r1     s    
zPhiInstr.descrc             C   s"   t |tst| j||f d S )N)r   r   r   r   r.   )r   rw   rp   r   r   r"   add_incoming  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'   rv   rr   )r3   r2   r   r"   r)   "  s   z*PhiInstr.replace_usage.<locals>.<listcomp>)r   )r   r2   r3   r   )r3   r2   r"   r4   !  s    zPhiInstr.replace_usage)r5   r7   r8   r   r1   r   r4   r:   r   r   )r!   r"   r     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 )Nz!vector needs to be of VectorType.zindex needs to be of IntType.Zextractelement)r   )
r   r,   r   r   rN   rf   elementr   r   r   )r   r   vectorindexr   r    )r!   r   r"   r   &  s    zExtractElement.__init__c             C   s0   d dd | jD }|dj| j|d d S )Nz, c             s   s    | ]}d  |j| V  qdS )z{0} {1}N)r/   r,   r&   )r'   r(   r   r   r"   r   0  s   z'ExtractElement.descr.<locals>.<genexpr>z{opname} {operands}
)r   r   )r+   r   r.   r/   r   )r   r0   r   r   r   r"   r1   /  s    
zExtractElement.descr)r   )r5   r7   r8   r   r1   r:   r   r   )r!   r"   r   %  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f t |jtjsPtd|j}tt| j	||d|||g|d d S )Nz!vector needs to be of VectorType.z"value needs to be of type % not %.zindex needs to be of IntType.Zinsertelement)r   )
r   r,   r   r   rN   r   rf   r   r   r   )r   r   r   rw   r   r   r    )r!   r   r"   r   6  s    zInsertElement.__init__c             C   s0   d dd | jD }|dj| j|d d S )Nz, c             s   s    | ]}d  |j| V  qdS )z{0} {1}N)r/   r,   r&   )r'   r(   r   r   r"   r   C  s   z&InsertElement.descr.<locals>.<genexpr>z{opname} {operands}
)r   r   )r+   r   r.   r/   r   )r   r0   r   r   r   r"   r1   B  s    
zInsertElement.descr)r   )r5   r7   r8   r   r1   r:   r   r   )r!   r"   r   5  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r\t |jtjr\|jjtdkrdtdt|jj|jj	}t
|tkr|jj	n
d|jj	  t fdd|jD st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.rd   z'mask needs to be a constant i32 vector.r~   c             3   s   | ]}|j  kV  qd S )N)constant)r'   Zii)index_ranger   r"   r   X  s    z)ShuffleVector.__init__.<locals>.<genexpr>zmask values need to be in {0}Zshufflevector)r   )r   r,   r   r   rN   r   r
   r   rf   r   rJ   allr   
IndexErrorr/   r   r   r   )r   r   Zvector1Zvector2maskr   r    )r!   )r   r"   r   I  s$    
zShuffleVector.__init__c             C   s0   | dddd | jD | jdd d S )Nzshufflevector {0} {1}
z, c             s   s    | ]}d  |j| V  qdS )z{0} {1}N)r/   r,   r&   )r'   r(   r   r   r"   r   a  s   z&ShuffleVector.descr.<locals>.<genexpr>T)r*   )r.   r/   r+   r   r-   )r   r0   r   r   r"   r1   _  s    

zShuffleVector.descr)r   )r5   r7   r8   r   r1   r:   r   r   )r!   r"   r   H  s   r   c                   s&   e Zd Zd fdd	Zdd Z  ZS )ExtractValuer   c          	      s~   |j }yx|D ]}|j| }qW W n. ttfk
rP   tdt||j f Y nX tt| j||d|g|d || _	|| _
d S )NzCan't index at %r in %sZextractvalue)r   )r,   elementsAttributeErrorr   rN   r   r   r   r   	aggregater   )r   r   aggr   r   r    rQ   )r!   r   r"   r   g  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   )str)r'   rQ   r   r   r"   r)   w  s    z&ExtractValue.descr.<locals>.<listcomp>zextractvalue {0} {1}, {2} {3}
z, T)r*   )r   r.   r/   r   r,   r&   r+   r-   )r   r0   r   r   r   r"   r1   v  s    zExtractValue.descr)r   )r5   r7   r8   r   r1   r:   r   r   )r!   r"   r   f  s   r   c                   s&   e Zd Zd fdd	Zdd Z  ZS )InsertValuer   c          	      s   |j }yx|D ]}|j| }qW W n. ttfk
rP   tdt||j f Y nX |j |krxtd|t||j |j f tt| j||j d||g|d || _	|| _
|| _d S )NzCan't index at %r in %sz&Can only insert %s at %r in %s: got %sZinsertvalue)r   )r,   r   r   r   rN   r   r   r   r   r   rw   r   )r   r   r   elemr   r   r    rQ   )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'   rQ   r   r   r"   r)     s    z%InsertValue.descr.<locals>.<listcomp>z&insertvalue {0} {1}, {2} {3}, {4} {5}
z, T)r*   )	r   r.   r/   r   r,   r&   rw   r+   r-   )r   r0   r   r   r   r"   r1     s    zInsertValue.descr)r   )r5   r7   r8   r   r1   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   rb   )r   r   )r!   r   r"   r     s    zUnreachable.__init__c             C   s   || j df7 }d S )N
)r   )r   r0   r   r   r"   r1     s    zUnreachable.descr)r5   r7   r8   r   r1   r:   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 )N)rO   r,   rL   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   r.   r/   r   r   )r   r0   r   fmtr   r   r"   r1     s    zInlineAsm.descrc             C   s   g }|  | d|S )Nr   )r1   r+   )r   r0   r   r   r"   r&     s    
zInlineAsm.get_referencec             C   s   d | j|  S )Nz{0} {1})r/   r,   r&   )r   r   r   r"   __str__  s    zInlineAsm.__str__N)F)r5   r7   r8   r   r1   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	atomicrmw)r   )r   r   r   r,   	operationr   )r   r   r(   r   rv   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}
T)r*   )r(   ptrtyr   Zvaltyrv   r   r   )r   r.   r/   r   r,   r&   r   r-   )r   r0   r   rv   r   r   r   r"   r1     s    
zAtomicRMW.descr)r5   r7   r8   r   r1   r:   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 )Nr   Zcmpxchg)r   )	r   ZLiteralStructTyper,   rf   r   r   r   r   failordering)	r   r   r   cmprv   r   r   r   Zouttype)r!   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}
T)r*   )r   r   r[   r   rv   r   r   r   )r   r.   r/   r,   r&   r   r   r-   )r   r0   r   Zcmpvalrv   r   r   r   r"   r1     s    zCmpXchg.descr)r5   r7   r8   __doc__r   r1   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 )N)rw   )r   rw   r   r   r"   r     s    z_LandingPadClause.__init__c             C   s   dj | j| jj| j dS )Nz{kind} {type} {value})kindr,   rw   )r/   r   rw   r,   r&   )r   r   r   r"   r     s    z_LandingPadClause.__str__N)r5   r7   r8   r   r   r   r   r   r"   r     s   r   c               @   s   e Zd ZdZdS )CatchClauseZcatchN)r5   r7   r8   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 )N)	r   r
   r   r,   r   Z	ArrayTyper   r   r   )r   rw   )r!   r   r"   r     s    zFilterClause.__init__)r5   r7   r8   r   r   r:   r   r   )r!   r"   r     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
landingpad)r   )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 )N)r   r   r   r   r.   )r   clauser   r   r"   
add_clause  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})r/   )r'   r   r   r   r"   r)     s   z)LandingPadInstr.descr.<locals>.<listcomp>)r,   r   r   )r.   r/   r,   r   r+   r   )r   r0   r   r   r   r"   r1     s
    
zLandingPadInstr.descr)r   F)r5   r7   r8   r   r   r1   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                sP   t t| j|t dd|d || jkr@td|d| j|| _	|| _
d S )NZfencer   )r   z3Invalid fence ordering "{0}"! Should be one of {1}.z, )r   r   r   r   rb   VALID_FENCE_ORDERINGSre   r/   r+   r   targetscope)r   r   r   r   r   )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   r/   r.   r   )r   r0   r   r   r   r   r"   r1   '  s    

zFence.descr)Nr   )r5   r7   r8   r   r   r   r1   r:   r   r   )r!   r"   r     s   r   N):r   Z
__future__r   r   r   r   valuesr   r   r   r	   r
   r   r   r   r   Z_utilsr   r   r;   r?   rE   r^   ra   rc   ri   rk   rl   rm   rs   ry   rz   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   ,*O!%	
