
    sKg|                        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ee      Z G d de      Z eg d	      Z G d
 de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d dee      Z G d dee      Z G d dee      Z G d de      Z G d  d!e      Z G d" d#e      Z  G d$ d%e       Z! G d& d'e       Z" G d( d)e      Z# G d* d+e      Z$ G d, d-e      Z% G d. d/e      Z& G d0 d1e      Z' G d2 d3e      Z( G d4 d5e      Z) G d6 d7e      Z* G d8 d9e      Z+ G d: d;e      Z, G d< d=e      Z- G d> d?e      Z. G d@ dAe      Z/ G dB dCe      Z0 G dD dEe1      Z2 G dF dGe      Z3 G dH dIe      Z4 G dJ dKe1      Z5 G dL dMe5      Z6 G dN dOe5      Z7 G dP dQe      Z8 G dR dSe      Z9 G dT dUe      Z:yV)Wz)
Implementation of LLVM IR instructions.
    )types)
BlockFunctionValue
NamedValueConstantMetaDataArgumentMetaDataStringAttributeSet	UndefinedArgumentAttributes)_HasMetadatac                   R     e Zd Zd fd	Zed        Zed        Zd Zd Zd Z	 xZ
S )Instructionc                     t         t        |   |||       t        |t              sJ t        |t
        t        f      sJ || _        || _        t        |      | _	        i | _
        y Nname)superr   __init__
isinstancer   tuplelistopnameoperandsflagsmetadata)selfparenttypr   r   r   r   	__class__s          \/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/llvmlite/ir/instructions.pyr   zInstruction.__init__   s]    k4)&#D)A&%(((%%/// %[
    c                 .    | j                   j                  S N)r   functionr   s    r"   r&   zInstruction.function   s    {{###r#   c                 B    | j                   j                  j                  S r%   )r   r&   moduler'   s    r"   r)   zInstruction.module   s    {{##***r#   c                 l   | j                   }| j                  rdj                  |g| j                  z         }dj                  | j                  D cg c]  }|j	                          c}      }| j
                  }| j                  d      }|j                  dj                  ||||             y c c}w )N , Tleading_comma{0} {1} {2}{3}
)	r   r   joinr   get_referencetype_stringify_metadataappendformat)r   bufr   opr   r    r   s          r"   descrzInstruction.descr   s    ::XXvh34F994==I=Rb..0=IJii++$+?

%F63(;	= Js   B1c                     || j                   v rKg }| j                   D ]  }|j                  ||u r|n|        t        |      | _         | j                          y y r%   )r   r4   r   _clear_string_cache)r   oldnewopsr7   s        r"   replace_usagezInstruction.replace_usage(   sQ    $--Cmm

")34 $!#JDM$$&  r#   c                     d| j                   j                  d| j                  d| j                  d| j                  d| j
                  dS )Nz<ir.r+   z
 of type 'z
', opname z, operands >)r!   __name__r   r2   r   r   r'   s    r"   __repr__zInstruction.__repr__0   s2    NN##TYY		KK( 	(r#     )rA   
__module____qualname__r   propertyr&   r)   r8   r>   rB   __classcell__r!   s   @r"   r   r      s?     $ $ + +='(r#   r   c                        e Zd Z eg d      Zy)CallInstrAttributes)
convergentnoreturnnounwindreadonlyreadnonenoinlinealwaysinlineNrA   rF   rG   	frozenset_knownrE   r#   r"   rL   rL   6   s     @ AFr#   rL   )tailmusttailnotailc                        e Zd Z eg d      Zy)FastMathFlags)fastnnanninfnszarcpcontractafnreassocNrT   rE   r#   r"   r[   r[   >   s     * +Fr#   r[   c                        e Zd Z	 	 d	 fd	Zed        Zej                  d        Zed        Zd Zed        Z	d Z
d Z xZS )
	CallInstrc
           	         |t        |t              r|j                  n|| _        t        |t              r	|t
        v rn|rd}nd}|| _        t        |      | _        t        |      | _
        i | _        |	r`|	j                         D ]M  \  }
}d|
cxk  rt        |      k  sn t        dj                  |
            t!        |      | j                  |
<   O t#        |      }t%        t        |j&                  j(                              D ]  }||   }|j&                  j(                  |   }t        |t*        j,                        r|j.                  |k7  rt1        |      }|j.                  |k7  r+dj                  d|z   ||j.                        }t3        |      |||<    t4        t6        | s  ||j&                  j:                  d|gt#        |      z   |       y )	NrW   rD   r   zInvalid argument index {}z%Type of #{0} arg mismatch: {1} != {2}   callr   )r   r   calling_conventioncconvstrTailMarkerOptionsrW   r[   fastmathrL   
attributesarg_attributesitemslen
ValueErrorr5   r   r   rangefunction_typeargsr   MetaDataTyper2   r	   	TypeErrorr   re   r   return_type)r   r   funcru   r   rj   rW   rm   attrs	arg_attrsidxiargexpected_typemsgr!   s                  r"   r   zCallInstr.__init__D   s    :dH+E --  	
 dC T->%>DD	%h/-e4 'oo/
US,3t9,$%@&,fSk3 3+=e+D##C(	 0 Dzs4--2234Aq'C ..33A6M=%*<*<=HH-&s+xx=(>q1umSXX> n$DG 5 	i'0B0B0N0N(.d0C$ 	( 	Pr#   c                      | j                   d   S Nr   r   r'   s    r"   calleezCallInstr.calleeo       }}Qr#   c                 "    || j                   d<   y r   r   )r   	newcallees     r"   r   zCallInstr.callees   s    $ar#   c                      | j                   dd  S Nrg   r   r'   s    r"   ru   zCallInstr.argsw   s    }}QR  r#   c                 n    |j                   | j                  j                   k7  rt        d      || _        y )Nz"New function has incompatible type)rt   r   rw   )r   newfuncs     r"   replace_calleezCallInstr.replace_callee{   s-      DKK$=$==@AAr#   c                     | j                   S )zThe callee function)r   r'   s    r"   called_functionzCallInstr.called_function   s     {{r#   c                      fd}dj                  t         j                        D cg c]  \  }} |||       c}}      } j                  j                  }|j
                  r|}n|j                  }dj                  | j                  j                               }	 j                  rdj                   j                  |	      }	d}
 j                  rdj                   j                        }
 j                  r7ddj                   j                  j                  |j                              z   nd} j                  r7ddj                   j                  j                  |j                              z   nd}|j                  dj                  |
 j                  |	||||r j!                  d	      nd
             y c c}}w )Nc                     | j                   v r;dj                  j                   |    j                  |j                              dz   }nd}dj	                  |j                  ||j                               S )Nr+   rD   
{0} {1}{2})ro   r0   _to_listr2   r5   r1   )r}   arz   r   s      r"   	descr_argz#CallInstr._descr.<locals>.descr_arg   sc    D'''!4!4Q!7!@!@!HICO&&qvvuaoo6GHHr#   r,   {0} {1}rD   z{0} r+   z2{tail}{op}{fastmath} {callee}({args}){attr}{meta}
Tr-   )rW   r7   r   rm   ru   attrmeta)r0   	enumerateru   r   rt   var_argrx   r5   r1   rj   rW   rn   r   rm   r4   r   r3   )r   r6   add_metadatar   r}   r   ru   fntyty
callee_reftail_markerfn_attrsfm_attrss   `            r"   _descrzCallInstr._descr   s   	I yyi		6JK6Jda)Aq/6JKL{{((<<B !!B%%b$++*C*C*EF
::"))$**jAJ99 --		2K  $//":":4;K;K"LMM$& 	 }} $--"8"89I9I"JKK"$ 	 	

HOO{{! ***>') P 	
 		1 Ls   G
c                 *    | j                  |d       y )NTr   )r   r   r6   s     r"   r8   zCallInstr.descr   s    Cd+r#   )rD   NNrE   rE   N)rA   rF   rG   r   rH   r   setterru   r   r   r   r8   rI   rJ   s   @r"   re   re   C   st    EI26)PV     ]]% % ! !
  (T,r#   re   c                   .     e Zd Z	 	 d fd	Z fdZ xZS )InvokeInstrc                     t        |t              sJ t        |t              sJ t        t        |   |||||d||	|
	       d| _        || _        || _        y )NF)rW   rm   rz   r{   invoke)r   r   r   r   r   r   	normal_to	unwind_to)r   r   ry   ru   r   r   r   rj   rm   rz   r{   r!   s              r"   r   zInvokeInstr.__init__   sc    )U+++)U+++k4)&$dE/4x05 	* 	L ""r#   c           	          t         t        |   |d       |j                  dj	                  | j
                  j                         | j                  j                         | j                  d                   y )NFr   z.      to label {0} unwind label {1}{metadata}
Tr-   )r   )	r   r   r   r4   r5   r   r1   r   r3   )r   r6   r!   s     r"   r8   zInvokeInstr.descr   sh    k4'%'@

DKKNN((*NN((*--D-A L 
 	r#   )rD   NrE   rE   NrA   rF   rG   r   r8   rI   rJ   s   @r"   r   r      s    FH>B	# r#   r   c                   $     e Zd Z fdZd Z xZS )
Terminatorc                 V    t         t        |   |t        j                         ||       y r%   )r   r   r   r   VoidType)r   r   r   r   r!   s       r"   r   zTerminator.__init__   s"    j$(1A6)1	3r#   c           
      0   | j                   }dj                  | j                  D cg c],  }dj                  |j                  |j                               . c}      }| j                  d      }|j                  dj                  |||             y c c}w )Nr,   r   Tr-   r   )r   r0   r   r5   r2   r1   r3   r4   )r   r6   r   r7   r   r   s         r"   r8   zTerminator.descr   s    99(,7(5" (..rww8H8H8JK(57 8++$+?

<&&vxBC7s   1Br   rJ   s   @r"   r   r      s    3Dr#   r   c                       e Zd Zd Zy)PredictableInstrc                    t        | j                  d      g}|D ]@  }|dk  rt        d      |j                  t	        t        j                  d      |             B | j                  j                  |      }| j                  d|       y )Nbranch_weightsr   z(branch weight must be a positive integer    prof)	r
   r)   rr   r4   r   r   IntTyper   set_metadata)r   weightsr   wmds        r"   set_weightszPredictableInstr.set_weights   su    "4;;0@ABA1u !KLLOOHU]]2%6:;  [[%%h/&"%r#   N)rA   rF   rG   r   rE   r#   r"   r   r      s    &r#   r   c                   6     e Zd Zd fd	Zed        Zd Z xZS )Retc                 >    ||gng }t         t        |   |||       y r%   )r   r   r   )r   r   r   return_valuer   r!   s        r"   r   zRet.__init__   s$    %1%=L>2c4!&&(;r#   c                 :    | j                   r| j                   d   S y r   r   r'   s    r"   r   zRet.return_value   s    ====##r#   c                 &   | j                   }| j                  d      }|F|j                  dj                  | j                  |j
                  |j                         |             y |j                  dj                  | j                  |             y )NTr-   r/   z{0}{1}
)r   r3   r4   r5   r   r2   r1   )r   r6   r   r   s       r"   r8   z	Ret.descr   s{    ((++$+?#JJ)t{{L,=,=+99;')*
 JJz((h?@r#   r%   )rA   rF   rG   r   rH   r   r8   rI   rJ   s   @r"   r   r      s"    <  	Ar#   r   c                       e Zd Zy)BranchNrA   rF   rG   rE   r#   r"   r   r          r#   r   c                       e Zd Zy)ConditionalBranchNr   rE   r#   r"   r   r      r   r#   r   c                   :     e Zd Z fdZed        Zd Zd Z xZS )IndirectBranchc                 @    t         t        |   |||g       g | _        y r%   )r   r   r   destinations)r   r   r   addrr!   s       r"   r   zIndirectBranch.__init__  s     nd,VVdVDr#   c                      | j                   d   S r   r   r'   s    r"   addresszIndirectBranch.address  r   r#   c                 ^    t        |t              sJ | j                  j                  |       y r%   )r   r   r   r4   )r   blocks     r"   add_destinationzIndirectBranch.add_destination
  s&    %'''  'r#   c           
      V   | j                   D cg c]!  }dj                  |j                               # }}|j                  dj                  | j                  j
                  | j                  j                         dj                  |      | j                  d                   y c c}w )Nz	label {0}zindirectbr {0} {1}, [{2}]  {3}
r,   Tr-   )r   r5   r1   r4   r   r2   r0   r3   )r   r6   blkr   s       r"   r8   zIndirectBranch.descr  s    #'#4#46#4C $**3+<+<+>?#4 	 6

5<<LLLL&&(IIl#$$4$8	
 	6s   &B&)	rA   rF   rG   r   rH   r   r   r8   rI   rJ   s   @r"   r   r     s&        (r#   r   c                   :     e Zd Z fdZed        Zd Zd Z xZS )SwitchInstrc                 N    t         t        |   |||g       || _        g | _        y r%   )r   r   r   defaultcases)r   r   r   valr   r!   s        r"   r   zSwitchInstr.__init__  s&    k4)&&3%@
r#   c                      | j                   d   S r   r   r'   s    r"   valuezSwitchInstr.value   r   r#   c                     t        |t              sJ t        |t              s t        | j                  j
                  |      }| j                  j                  ||f       y r%   )r   r   r   r   r   r2   r   r4   )r   r   r   s      r"   add_casezSwitchInstr.add_case$  sF    %'''#u%4::??C0C

3,'r#   c                    | j                   D cg c]>  \  }}dj                  |j                  |j                         |j                               @ }}}|j	                  dj                  | j
                  j                  | j
                  j                         | j                  j                         dj                  |      | j                  d                   y c c}}w )Nz{0} {1}, label {2}z%switch {0} {1}, label {2} [{3}]  {4}
r+   Tr-   )	r   r5   r2   r1   r4   r   r   r0   r3   )r   r6   r   r   r   s        r"   r8   zSwitchInstr.descr*  s     "&-!+XS# &,,SXXs7H7H7J-0->->-@B!+ 	 - 	

;BBJJOOJJ$$&LL&&(HHUO$$4$8
 	-s   AC)	rA   rF   rG   r   rH   r   r   r8   rI   rJ   s   @r"   r   r     s&    
    (
r#   r   c                       e Zd Zy)ResumeNr   rE   r#   r"   r   r   7  r   r#   r   c                   V     e Zd Zd fd	Zed        Zed        Zed        Zd Z xZ	S )SelectInstrc                     |j                   |j                   k(  sJ t        t        |   ||j                   d|||g||       y )Nselectr   r   )r2   r   r   r   )r   r   condlhsrhsr   r   r!   s          r"   r   zSelectInstr.__init__<  sF    xx388###k4)&#((H+/c*:05 	* 	7r#   c                      | j                   d   S r   r   r'   s    r"   r   zSelectInstr.condB  r   r#   c                      | j                   d   S r   r   r'   s    r"   r   zSelectInstr.lhsF  r   r#   c                      | j                   d   S )N   r   r'   s    r"   r   zSelectInstr.rhsJ  r   r#   c                    |j                  dj                  dj                  | j                        | j                  j
                  | j                  j                         | j                  j
                  | j                  j                         | j                  j
                  | j                  j                         | j                  d                   y )Nz)select {0} {1} {2}, {3} {4}, {5} {6} {7}
r+   Tr-   )
r4   r5   r0   r   r   r2   r1   r   r   r3   r   s     r"   r8   zSelectInstr.descrN  s    

?FFHHTZZ IINNDII335HHMM488113HHMM488113$$4$8
 	r#   rC   )
rA   rF   rG   r   rH   r   r   r   r8   rI   rJ   s   @r"   r   r   ;  sI    7            r#   r   c                   2     e Zd ZdZi Zdg f fd	Zd Z xZS )CompareInstrzinvalid-comparerD   c                    || j                   vrt        d|d| j                        |D ]+  }|| j                  vst        d|d| j                         | j                  }t	        |j
                  t        j                        r>t        j                  t        j                  d      |j
                  j                        }	nt        j                  d      }	t        t        | 3  ||	|||g||       || _        y )Nzinvalid comparison z for zinvalid flag rg   )r   r   )VALID_OPrr   OPNAME
VALID_FLAGr   r2   r   
VectorTyper   countr   r   r   r7   )r   r   r7   r   r   r   r   flagr   r    r!   s             r"   r   zCompareInstr.__init__]  s    T]]"r4;;OPPD4??* T4;;!OPP  chh 0 01""5==#3SXX^^DC--"ClD*63+1C:U04 	+ 	6 r#   c                 t   |j                  dj                  | j                  dj                  d | j                  D              | j
                  | j                  d   j                  | j                  d   j                         | j                  d   j                         | j                  d                   y )	Nz.{opname}{flags} {op} {ty} {lhs}, {rhs} {meta}
rD   c              3   &   K   | ]	  }d |z     yw)r+   NrE   ).0its     r"   	<genexpr>z%CompareInstr.descr.<locals>.<genexpr>p  s     8Zr#(Zs   r   rg   Tr-   )r   r   r7   r   r   r   r   )
r4   r5   r   r0   r   r7   r   r2   r1   r3   r   s     r"   r8   zCompareInstr.descrm  s    

DKK;;''8TZZ88ww}}Q$$a ..0a ..0)))= L 
 	r#   )rA   rF   rG   r   r   r   r8   rI   rJ   s   @r"   r   r   X  s    FH24B  	r#   r   c                   8    e Zd ZdZdddddddd	d
dd
Z e       Zy)	ICMPInstr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ulesgtsgesltsleN)rA   rF   rG   r   r   setr   rE   r#   r"   r   r   y  s5    F&*#'$(!%H Jr#   r   c                   |    e Zd ZdZi dddddddd	d
dddddddddddddddddddddd d!Zh d"Zy#)$	FCMPInstrfcmpfalsez#no comparison, always returns falseoeqzordered and equalogtzordered and greater thanogez!ordered and greater than or equaloltzordered and less thanolezordered and less than or equalonezordered and not equalordzordered (no nans)ueqzunordered or equalr  zunordered or greater thanr  z"unordered or greater than or equalr  zunordered or less thanr  zunordered or less than or equalunezunordered or not equalunozunordered (either nans)truez"no comparison, always returns true>   rb   r_   r`   r\   r^   r]   rc   ra   N)rA   rF   rG   r   r   r   rE   r#   r"   r  r    s    F6" 	) 	2	
 	& 	/ 	& 	" 	# 	* 	3 	' 	0 	' 	(  	4!H$Jr#   r  c                   &     e Zd Zd fd	Zd Z xZS )	CastInstrc                 8    t         t        |   ||||g|       y r   )r   r  r   )r   r   r7   r   r    r   r!   s         r"   r   zCastInstr.__init__  s    i'R#T'Jr#   c                     |j                  dj                  | j                  | j                  d   j                  | j                  d   j                         | j                  | j                  d                   y )Nz{0} {1} {2} to {3} {4}
r   Tr-   )r4   r5   r   r   r2   r1   r3   r   s     r"   r8   zCastInstr.descr  sb    

-44KKMM!!!MM!**,II$$4$8
 	r#   rD   r   rJ   s   @r"   r  r    s    Kr#   r  c                   &     e Zd Zd fd	Zd Z xZS )	LoadInstrc                 n    t         t        |   ||j                  j                  d|g|       d | _        y )Nloadr   )r   r#  r   r2   pointeealign)r   r   ptrr   r!   s       r"   r   zLoadInstr.__init__  s5    i'0@0@&),D 	( 	:
r#   c                    | j                   \  }| j                  d| j                  z  }nd}|j                  dj                  |j                  j
                  |j                  |j                         || j                  d                   y )N
, align %drD   zload {0}, {1} {2}{3}{4}
Tr-   )r   r'  r4   r5   r2   r&  r1   r3   )r   r6   r   r'  s       r"   r8   zLoadInstr.descr  sx    ::! DJJ/EE

.55HHHH$$4$8
 	r#   r!  r   rJ   s   @r"   r#  r#    s    
r#   r#  c                   $     e Zd Z fdZd Z xZS )
StoreInstrc                 Z    t         t        |   |t        j                         d||g       y )Nstore)r   r,  r   r   r   )r   r   r   r(  r!   s       r"   r   zStoreInstr.__init__  s&    j$(1A7*-s	5r#   c                 (   | j                   \  }}| j                  d| j                  z  }nd}|j                  dj                  |j                  |j                         |j                  |j                         || j                  d                   y )Nr*  rD   zstore {0} {1}, {2} {3}{4}{5}
Tr-   )r   r'  r4   r5   r2   r1   r3   )r   r6   r   r(  r'  s        r"   r8   zStoreInstr.descr  s    ==S::! DJJ/EE

3::HHHH$$4$8
 	r#   r   rJ   s   @r"   r,  r,    s    5r#   r,  c                   &     e Zd Zd fd	Zd Z xZS )LoadAtomicInstrc                 |    t         t        |   ||j                  j                  d|g|       || _        || _        y )Nzload atomicr   )r   r1  r   r2   r&  orderingr'  )r   r   r(  r3  r'  r   r!   s         r"   r   zLoadAtomicInstr.__init__  s=    ot-fchh6F6F.;cU 	. 	O 
r#   c                 
   | j                   \  }|j                  dj                  |j                  j                  |j                  |j                         | j                  | j                  | j                  d                   y )Nz+load atomic {0}, {1} {2} {3}, align {4}{5}
Tr-   )	r   r4   r5   r2   r&  r1   r3  r'  r3   )r   r6   r   s      r"   r8   zLoadAtomicInstr.descr  sf    

AHHHHHHMMJJ$$4$8
 	r#   r!  r   rJ   s   @r"   r1  r1    s    	r#   r1  c                   $     e Zd Z fdZd Z xZS )StoreAtomicInstrc                 v    t         t        |   |t        j                         d||g       || _        || _        y )Nzstore atomic)r   r6  r   r   r   r3  r'  )r   r   r   r(  r3  r'  r!   s         r"   r   zStoreAtomicInstr.__init__  s6    .vu~~7G/=Sz	K 
r#   c                    | j                   \  }}|j                  dj                  |j                  |j	                         |j                  |j	                         | j
                  | j                  | j                  d                   y )Nz0store atomic {0} {1}, {2} {3} {4}, align {5}{6}
Tr-   )r   r4   r5   r2   r1   r3  r'  r3   )r   r6   r   r(  s       r"   r8   zStoreAtomicInstr.descr  sn    ==S

FMMHHHHMMJJ$$4$8
 	r#   r   rJ   s   @r"   r6  r6    s    
r#   r6  c                   $     e Zd Z fdZd Z xZS )AllocaInstrc                 l    |r|gnd}t         t        |   ||j                         d||       d | _        y )NrE   alloca)r   r:  r   
as_pointerr'  )r   r   r    r   r   r   r!   s         r"   r   zAllocaInstr.__init__  s6    #E7k4)&#..2BH*2D	:
r#   c                    |j                  dj                  | j                  | j                  j                               | j
                  rG| j
                  \  }|j                  dj                  |j                  |j                                      | j                  *|j                  dj                  | j                               | j                  r"|j                  | j                  d             y y )Nr   z	, {0} {1}z, align {0}Tr-   )
r4   r5   r   r2   r&  r   r1   r'  r   r3   )r   r6   r7   s      r"   r8   zAllocaInstr.descr	  s    

9##DKK1B1BCD==--CBJJ{))"''23C3C3EFG::!JJ}++DJJ78==JJt//d/CD r#   r   rJ   s   @r"   r:  r:    s    Er#   r:  c                   $     e Zd Z fdZd Z xZS )GEPInstrc           	         |j                   }d }d}|D ]<  }	||j                  |	      }}t        |t        j                        s1|j
                  }> t        |t        j                        st        |t        j                        r|}n|j                  |      }t        t        | '  ||d|gt        |      z   |       || _        || _        || _        y )Nr   getelementptrr   )r2   gepr   r   PointerType	addrspacer=  r   r@  r   r   pointerindicesinbounds)r   r   r(  rG  rH  r   r    lasttyplastaddrspacer}   r!   s             r"   r   zGEPInstr.__init__  s    hhA
SG'5#4#45 ' 1 1	  3 1 127E$5$56C../Ch&vsO(+utG}'<4 	' 	I r#   c                    | j                   D cg c],  }dj                  |j                  |j                               . }}| j                  rdnd}|j                  dj                  || j                  j                  j                  | j                  j                  | j                  j                         dj                  |      | j                  d                   y c c}w )Nr   zgetelementptr inboundsrB  z{0} {1}, {2} {3}, {4} {5}
r,   Tr-   )
rG  r5   r2   r1   rH  r4   rF  r&  r0   r3   )r   r6   r}   rG  r7   s        r"   r8   zGEPInstr.descr+  s     LL*(q ##AFFAOO,=>( 	 *)-%O

077<<$$,,<<$$<<--/99W%++$+? 	*s   1C!r   rJ   s   @r"   r@  r@    s    !,r#   r@  c                   2     e Zd Zd fd	Zd Zd Zd Z xZS )PhiInstrc                 F    t         t        |   ||dd||       g | _        y )NphirE   r   )r   rM  r   	incomings)r   r   r    r   r   r!   s        r"   r   zPhiInstr.__init__:  s+    h&vsE2D-2 	' 	4r#   c           
          dj                  d | j                  D              }|j                  dj                  dj                  | j                        | j
                  || j                  d                   y )Nr,   c              3   ~   K   | ]5  \  }}d j                  |j                         |j                                7 yw)z
[{0}, {1}]N)r5   r1   )r   vbs      r"   r   z!PhiInstr.descr.<locals>.<genexpr>@  s;      5%3TQ &,,Q__->-.__->@%3s   ;=zphi {0} {1} {2} {3}
r+   Tr-   )r0   rP  r4   r5   r   r2   r3   )r   r6   incss      r"   r8   zPhiInstr.descr?  sh    yy 5%)^^5 5 	

*1188DJJ'99++$+?	 	r#   c                 b    t        |t              sJ | j                  j                  ||f       y r%   )r   r   rP  r4   )r   r   r   s      r"   add_incomingzPhiInstr.add_incomingJ  s(    %'''uen-r#   c                 h    | j                   D cg c]  \  }}||u r|n||f c}}| _         y c c}}w r%   )rP  )r   r;   r<   r   r   s        r"   r>   zPhiInstr.replace_usageN  s;    ,0NN<,:jsC $'#:C3=,:< <s   .)rE   )rA   rF   rG   r   r8   rW  r>   rI   rJ   s   @r"   rM  rM  9  s    
	.<r#   rM  c                   &     e Zd Zd fd	Zd Z xZS )ExtractElementc                 "   t        |j                  t        j                        st	        d      t        |j                  t        j
                        st	        d      |j                  j                  }t        t        | '  ||d||g|       y )N!vector needs to be of VectorType.index needs to be of IntType.extractelementr   )
r   r2   r   r   rw   r   elementr   rZ  r   )r   r   vectorindexr   r    r!   s         r"   r   zExtractElement.__init__T  su    &++u'7'78?@@%**emm4;<<kk!!nd,VS:J.4e_4 	- 	Ir#   c                     dj                  d | j                  D              }|j                  dj                  | j                  |             y )Nr,   c              3   p   K   | ].  }d j                  |j                  |j                                0 ywr   Nr5   r2   r1   r   r7   s     r"   r   z'ExtractElement.descr.<locals>.<genexpr>^  6      I:GB '--77B,,.0:G   46{opname} {operands}
r   r   r0   r   r4   r5   r   r   r6   r   s      r"   r8   zExtractElement.descr]  L    99 I:>--I I

*11++ 2 : 	;r#   r!  r   rJ   s   @r"   rZ  rZ  S  s    I;r#   rZ  c                   &     e Zd Zd fd	Zd Z xZS )InsertElementc                    t        |j                  t        j                        st	        d      |j                  |j                  j
                  k(  s9t	        dj                  |j                  j
                  |j                              t        |j                  t        j                        st	        d      |j                  }t        t        | +  ||d|||g|       y )Nr\  z$value needs to be of type {} not {}.r]  insertelementr   )r   r2   r   r   rw   r_  r5   r   r   ro  r   )r   r   r`  r   ra  r   r    r!   s          r"   r   zInsertElement.__init__e  s    &++u'7'78?@@zzV[[0006==KK''56 6 %**emm4;<<kkmT+FC-3UE,B 	, 	Or#   c                     dj                  d | j                  D              }|j                  dj                  | j                  |             y )Nr,   c              3   p   K   | ].  }d j                  |j                  |j                                0 ywrd  re  rf  s     r"   r   z&InsertElement.descr.<locals>.<genexpr>s  rg  rh  ri  rj  rk  rl  s      r"   r8   zInsertElement.descrr  rm  r#   r!  r   rJ   s   @r"   ro  ro  d  s    O;r#   ro  c                   &     e Zd Zd fd	Zd Z xZS )ShuffleVectorc                    t        |j                  t        j                        st	        d      |t
        k7  r$|j                  |j                  k7  rt	        d      t        |t              rut        |j                  t        j                        rQt        |j                  j                  t        j                        r#|j                  j                  j                  dk(  st	        d      t        j                  |j                  j                  |j                  j                        }t        |t
        k(  r|j                  j                  nd|j                  j                  z        t        fd|j                  D              st        dj                              t         t"        | K  ||d|||g|	       y )
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   :   K   | ]  }|j                   v   y wr%   )constant)r   iiindex_ranges     r"   r   z)ShuffleVector.__init__.<locals>.<genexpr>  s     F"2;;+-s   zmask values need to be in {0}shufflevectorr   )r   r2   r   r   rw   r   r   r_  r   widthr   rs   allrx  
IndexErrorr5   r   ru  r   )	r   r   vector1vector2maskr   r    rz  r!   s	          @r"   r   zShuffleVector.__init__z  sY   ',,(8(89@AAi||w||+ !L M M4*499e&6&67DII--u}}=""((B.EFFw||33TYY__E&)3 $LL..!"W\\%7%7!79 FFF/66{C  	mT+FC-4gt,D4 	, 	Qr#   c                     |j                  dj                  dj                  d | j                  D              | j	                  d                   y )Nzshufflevector {0} {1}
r,   c              3   p   K   | ].  }d j                  |j                  |j                                0 ywrd  re  rf  s     r"   r   z&ShuffleVector.descr.<locals>.<genexpr>  s2      6'4 '--bggr7G7G7IJ'4rh  Tr-   )r4   r5   r0   r   r3   r   s     r"   r8   zShuffleVector.descr  sJ    

,3399 6'+}}6 6++$+? 	r#   r!  r   rJ   s   @r"   ru  ru  y  s    Q.r#   ru  c                   &     e Zd Zd fd	Zd Z xZS )ExtractValuec                 
   |j                   }	 |D ]  }|j                  |   } 	 t        t        | #  ||d|g|       || _	        || _
        y # t        t        f$ r% t	        dt        |      d|j                         w xY w)NCan't index at  in extractvaluer   )r2   elementsAttributeErrorr~  rw   r   r   r  r   	aggregaterG  )r   r   aggrG  r   r    r}   r!   s          r"   r   zExtractValue.__init__  s    hh	9ll1o  	lD*63,/5t 	+ 	=  
+ 	9#G}chh8 9 9	9s   A 4Bc           
      .   | j                   D cg c]  }t        |       }}|j                  dj                  | j                  j
                  | j                  j                         dj                  |      | j                  d                   y c c}w )Nzextractvalue {0} {1}, {2} {3}
r,   Tr-   )	rG  rk   r4   r5   r  r2   r1   r0   r3   r   r6   r}   rG  s       r"   r8   zExtractValue.descr  sw    #'<<0<a3q6<0

4;;>>&&>>//199W%++$+?	 	 1s   Br!  r   rJ   s   @r"   r  r    s    r#   r  c                   &     e Zd Zd fd	Zd Z xZS )InsertValuec           
         |j                   }	 |D ]  }|j                  |   } 	 |j                   |k7  r4t	        d|dt        |      d|j                   d|j                         t        t        | #  ||j                   d||g|       || _	        || _
        || _        y # t        t        f$ r% t	        dt        |      d|j                         w xY w)Nr  r  zCan only insert z at z: got insertvaluer   )r2   r  r  r~  rw   r   r   r  r   r  r   rG  )	r   r   r  elemrG  r   r    r}   r!   s	           r"   r   zInsertValue.__init__  s    hh	9ll1o 
 99"DM388TYYH I Ik4)&#((M+.+D 	* 	B 
 
+ 	9#G}chh8 9 9	9s   B# #4Cc                    | j                   D cg c]  }t        |       }}|j                  dj                  | j                  j
                  | j                  j                         | j                  j
                  | j                  j                         dj                  |      | j                  d                   y c c}w )Nz&insertvalue {0} {1}, {2} {3}, {4} {5}
r,   Tr-   )
rG  rk   r4   r5   r  r2   r1   r   r0   r3   r  s       r"   r8   zInsertValue.descr  s    #'<<0<a3q6<0

<CC>>&&(D(D(F::??DJJ$<$<$>99W%++$+?	 	 1s   C r!  r   rJ   s   @r"   r  r    s    $r#   r  c                   $     e Zd Z fdZd Z xZS )Unreachablec                 Z    t         t        |   |t        j                         ddd       y )NunreachablerE   rD   r   )r   r  r   r   r   )r   r   r!   s     r"   r   zUnreachable.__init__  s*    k4)&%..2B*7" 	* 	Fr#   c                 &    || j                   dfz  }y )N
)r   r   s     r"   r8   zUnreachable.descr  s    T""r#   r   rJ   s   @r"   r  r    s    F#r#   r  c                   &    e Zd ZddZd Zd Zd Zy)	InlineAsmc                 ^    |j                   | _        || _        || _        || _        || _        y r%   )rx   r2   rt   asm
constraintside_effect)r   ftyper  r  r  s        r"   r   zInlineAsm.__init__  s-    %%	"$&r#   c                     | j                   rdnd}d}|j                  |j                  || j                  | j                               y )N
sideeffectrD   z)asm {sideeffect} "{asm}", "{constraint}"
)r  r  r  )r  r4   r5   r  r  )r   r6   r  fmts       r"   r8   zInlineAsm.descr  sA    %)%5%5\2
:

3::)-  : 	;r#   c                 J    g }| j                  |       dj                  |      S NrD   )r8   r0   r   s     r"   r1   zInlineAsm.get_reference  s     

3wws|r#   c                 V    dj                  | j                  | j                               S )Nr   re  r'   s    r"   __str__zInlineAsm.__str__  s"    		4+=+=+?@@r#   N)F)rA   rF   rG   r   r8   r1   r  rE   r#   r"   r  r    s    ';
Ar#   r  c                   $     e Zd Z fdZd Z xZS )	AtomicRMWc                 j    t         t        |   ||j                  d||f|       || _        || _        y )N	atomicrmwr   )r   r  r   r2   	operationr3  )r   r   r7   r(  r   r3  r   r!   s          r"   r   zAtomicRMW.__init__  s8    i'+),c
 	( 	? r#   c                    | j                   \  }}d}|j                  |j                  | j                  |j                  |j                         |j                  |j                         | j                  | j                  d                   y )NzBatomicrmw {op} {ptrty} {ptr}, {valty} {val} {ordering} {metadata}
Tr-   )r7   ptrtyr(  valtyr   r3  r   )r   r4   r5   r  r2   r1   r3  r3   )r   r6   r(  r   r  s        r"   r8   zAtomicRMW.descr  s|    ==S

3::$'HH"%"3"3"5$'HH"%"3"3"5'+}}'+'?'?04 (@ (6    	!r#   r   rJ   s   @r"   r  r    s    !!r#   r  c                   (     e Zd ZdZ fdZd Z xZS )CmpXchgzdThis instruction has changed since llvm3.5.  It is not compatible with
    older llvm versions.
    c                     t        j                  |j                  t        j                  d      g      }t        t
        |   ||d|||f|       || _        || _        y )Nrg   cmpxchgr   )	r   LiteralStructTyper2   r   r   r  r   r3  failordering)
r   r   r(  cmpr   r3  r  r   outtyper!   s
            r"   r   zCmpXchg.__init__  sZ    ))388U]]15E*FGgt%fgy'*CoD 	& 	B (r#   c                 <   | j                   \  }}}d}|j                  |j                  |j                  |j	                         |j                  |j	                         |j	                         | j
                  | j                  | j                  d                   y )NzScmpxchg {ptrty} {ptr}, {ty} {cmp}, {ty} {val} {ordering} {failordering} {metadata}
Tr-   )r  r(  r   r  r   r3  r  r   )r   r4   r5   r2   r1   r3  r  r3   )r   r6   r(  cmpvalr   r  s         r"   r8   zCmpXchg.descr  s    ==VS,

3::CHH"%"3"3"5!'"("6"6"8"%"3"3"5'+}}+/+<+<'+'?'?04 (@ (6  	  		!r#   rA   rF   rG   __doc__r   r8   rI   rJ   s   @r"   r  r    s    )!r#   r  c                       e Zd Zd Zd Zy)_LandingPadClausec                     || _         y r%   )r   )r   r   s     r"   r   z_LandingPadClause.__init__%  s	    
r#   c                     dj                  | j                  | j                  j                  | j                  j	                               S )Nz{kind} {type} {value})kindr2   r   )r5   r  r   r2   r1   r'   s    r"   r  z_LandingPadClause.__str__(  s<    &--****, . . 	.r#   N)rA   rF   rG   r   r  rE   r#   r"   r  r  $  s    .r#   r  c                       e Zd ZdZy)CatchClausecatchN)rA   rF   rG   r  rE   r#   r"   r  r  /  s    Dr#   r  c                   "     e Zd ZdZ fdZ xZS )FilterClausefilterc                     t        |t              sJ t        |j                  t        j                        sJ t
        t        |   |       y r%   )r   r   r2   r   	ArrayTyper   r  r   )r   r   r!   s     r"   r   zFilterClause.__init__6  s:    %***%**eoo666lD*51r#   )rA   rF   rG   r  r   rI   rJ   s   @r"   r  r  3  s    D2 2r#   r  c                   ,     e Zd Zd fd	Zd Zd Z xZS )LandingPadInstrc                 R    t         t        |   ||dg |       || _        g | _        y )N
landingpadr   )r   r  r   cleanupclauses)r   r   r    r   r  r!   s        r"   r   zLandingPadInstr.__init__=  s0    ot-fc<37 	. 	9r#   c                 ^    t        |t              sJ | j                  j                  |       y r%   )r   r  r  r4   )r   clauses     r"   
add_clausezLandingPadInstr.add_clauseC  s%    &"3444F#r#   c                     d}|j                  |j                  | j                  | j                  rdnddj	                  | j
                  D cg c]  }dj                  |       c}                   y c c}w )Nz$landingpad {type}{cleanup}{clauses}
z cleanuprD   z

      {0})r2   r  r  )r4   r5   r2   r  r0   r  )r   r6   r  r  s       r"   r8   zLandingPadInstr.descrG  ss    5

3::49948LLjb&(gg=A\\/K=I6 0=/C/CF/K=I/K 'L    	!/Ks   A5)rD   F)rA   rF   rG   r   r  r8   rI   rJ   s   @r"   r  r  <  s    $!r#   r  c                   2     e Zd ZdZh dZd fd	Zd Z xZS )Fencez|
    The `fence` instruction.

    As of LLVM 5.0.1:

    fence [syncscope("<target-scope>")] <ordering>  ; yields void
    >   acq_relacquirereleaseseq_cstc                     t         t        |   |t        j                         dd|       || j
                  vr6d}t        |j                  |dj                  | j
                                    || _	        || _
        y )NfencerE   r   z3Invalid fence ordering "{0}"! Should be one of {1}.r,   )r   r  r   r   r   VALID_FENCE_ORDERINGSrr   r5   r0   r3  targetscope)r   r   r3  r  r   r   r!   s         r"   r   zFence.__init__[  sz    eT#FENN,<gr)- 	$ 	/4555ICS[[)-43M3M)NP Q Q &r#   c                     | j                   d}ndj                  | j                         }d}|j                  |j                  || j                               y )NrD   zsyncscope("{0}") zfence {syncscope}{ordering}
)	syncscoper3  )r  r5   r4   r3  )r   r6   r  r  s       r"   r8   zFence.descre  sS    #I+2243C3CDI-

3::	'+}}    	!r#   r  )rA   rF   rG   r  r  r   r8   rI   rJ   s   @r"   r  r  P  s     I'	!r#   r  c                   (     e Zd ZdZ fdZd Z xZS )Commentz
    A line comment.
    c                 ~    t         t        |   |t        j                         ddd       d|vsJ d       || _        y )N;rE   rD   r   r  zComment cannot contain new line)r   r  r   r   r   text)r   r   r  r!   s      r"   r   zComment.__init__v  sD    gt%fenn.>R+- 	& 	/4B!BB	r#   c                 @    |j                  d| j                          y )Nz; )r4   r  r   s     r"   r8   zComment.descr|  s    

R		{#$r#   r  rJ   s   @r"   r  r  q  s    %r#   r  N);r  llvmlite.irr   llvmlite.ir.valuesr   r   r   r   r   r	   r
   r   r   r   llvmlite.ir._utilsr   r   rL   rU   rl   r[   re   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r#  r,  r1  r6  r:  r@  rM  rZ  ro  ru  r  r  r  objectr  r  r  r  r  r  r  r  r  rE   r#   r"   <module>r     s0   ? ? ? ,'(*l '(TA, A
 <= +L +
m, m,`) *
D 
D	&{ 	&A* A0	Z 		(* 	%z 0"J <	Z 	+ :; B " 0  , *k &{ (E+ E$"{ "J<{ <4;[ ;";K ;*K @; 6+ <#+ #A A.! !,!k !8. .# 2$ 2!k !(!K !B%k %r#   