
    I/Ph\                         d dl Z d dlZd dlmZmZmZ ddddddd	Zej        fd
Zej        fdZ	ej        fdZ
ej        fdZd Zd Zd Zd Zej        fdZd Z G d de          ZdS )    N)instructionstypesvaluesgtlteqnegele)><==!=z>=z<=c                       fd}|S )Nc                 J    t          j        |           dfd	            }|S )N  c                 h     | j         |j        |g||          }|                     |           |S Nblocktype_insert)selfargnameflagsinstrclsopnames        S/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/llvmlite/ir/builder.pywrappedz$_unop.<locals>.wrap.<locals>.wrapped   s9    C
CHfseT5IIELLL    r   r   	functoolswrapsfnr"   r   r    s     r!   wrapz_unop.<locals>.wrap   B    				 	 	 	 	 	 
		
 r#   r   r    r   r*   s   `` r!   _unopr-      )          Kr#   c                       fd}|S )Nc                 J    t          j        |           dfd	            }|S )Nr   r   c                     |j         |j         k    r t          d|j         d|j         d           | j        |j         ||f||          }|                     |           |S )N%Operands must be the same type, got (, ))r   
ValueErrorr   r   )r   lhsrhsr   r   r   r   r    s         r!   r"   z%_binop.<locals>.wrap.<locals>.wrapped   st    x38## j$'HHHchhh"8 9 9 9C
CHfsCj$NNELLLr#   r$   r%   r(   s     r!   r*   z_binop.<locals>.wrap   sB    				 	 	 	 	 	 
		 r#   r   r,   s   `` r!   _binopr8      s)    
 
 
 
 
 
 Kr#   c                       fd}|S )Nc                 H    t          j        |           dfd	            }|S )Nr   c                    |j         |j         k    r t          d|j         d|j         d          |j         }t          |t          j                  st          d|          t          j        d          }| j        }t          j        t          j        ||g          ||g          }|	                    d
d|g|          }| 
                    |||g|          }	|	S )	Nr2   r3   r4   zexpected an integer type, got    zllvm.z.with.overflowr   )r   r5   
isinstancer   IntType	TypeErrormoduleFunctionTypeLiteralStructTypedeclare_intrinsiccall)r   r6   r7   r   tybool_tymodfntyr)   retr    s             r!   r"   z3_binop_with_overflow.<locals>.wrap.<locals>.wrapped/   s    x38## j$'HHHchhh"8 9 9 9Bb%-00 Libb JKKKmA&&G+C%e&=r7m&L&L')2h0 0D&&&&&&'J(*tT3 3B))Bc
)66CJr#   r   r%   r)   r"   r    s     r!   r*   z"_binop_with_overflow.<locals>.wrap.   s=    				 	 	 	 	 
		" r#   r   r,   s   `  r!   _binop_with_overflowrM   -   s#        * Kr#   c                       fd}|S )Nc                 J    t          j        |           dfd	            }|S )Nr   c                 f     | j         |j        |g|          }|                     |           |S r   r   )r   operandr   r   r   r    s       r!   r"   z%_uniop.<locals>.wrap.<locals>.wrappedH   s7    C
GL&7)TJJELLLr#   rK   r%   r(   s     r!   r*   z_uniop.<locals>.wrapG   r+   r#   r   r,   s   `` r!   _unioprR   F   r.   r#   c                       fd}|S )Nc                 H    t          j        |           dfd	            }|S )Nr   c                     t          |j        t          j                  st	          d|j        z            | j                            |j        g          }|                     ||g|          S )N expected an integer type, got %s)r>   r   r   r?   r@   rA   rD   rE   r   rQ   r   r)   r    s       r!   r"   z3_uniop_intrinsic_int.<locals>.wrap.<locals>.wrappedU   sm    glEM:: "6L!" " " ..v~FFB99R'D111r#   rK   r%   rL   s     r!   r*   z"_uniop_intrinsic_int.<locals>.wrapT   s=    				2 	2 	2 	2 	2 
		2 r#   r   r    r*   s   ` r!   _uniop_intrinsic_intrY   S   s#    
 
 
 
 
 Kr#   c                       fd}|S )Nc                 H    t          j        |           dfd	            }|S )Nr   c                     t          |j        t          j        t          j        f          st          d|j        z            | j                            |j        g          }|                     ||g|          S )Nexpected a float type, got %s)	r>   r   r   	FloatType
DoubleTyper@   rA   rD   rE   rW   s       r!   r"   z5_uniop_intrinsic_float.<locals>.wrap.<locals>.wrappede   sr    L5?E4D"EG G P ?', NOOO..v~FFB99R'D111r#   rK   r%   rL   s     r!   r*   z$_uniop_intrinsic_float.<locals>.wrapd   s=    				2 	2 	2 	2 	2 
		2 r#   r   rX   s   ` r!   _uniop_intrinsic_floatr`   c   s#    	 	 	 	 	 Kr#   c                       fd}|S )Nc                 H    t          j        |           dfd	            }|S )Nr   c                 |   t          |j        t          j                  st	          d|j        z            t          |j        t          j                  r|j        j        dk    st	          d|j        z            | j                            |j        |j        g          }|                     |||g|          S )NrV   r<   zexpected an i1 type, got %s)	r>   r   r   r?   r@   widthrA   rD   rE   )r   rQ   flagr   r)   r    s        r!   r"   z9_uniop_intrinsic_with_flag.<locals>.wrap.<locals>.wrappedt   s    glEM:: "6L!" " " ty%-88 KIOq(( =	 IJJJ..ty13 3B99R'4$777r#   rK   r%   rL   s     r!   r*   z(_uniop_intrinsic_with_flag.<locals>.wraps   s=    			
	8 
	8 
	8 
	8 
	8 
	
	8 r#   r   rX   s   ` r!   _uniop_intrinsic_with_flagrf   r   s#          Kr#   c                       fd}|S )Nc                 H    t          j        |           dfd	            }|S )Nr   c                    |j         |j         k    s|j         |j         k    r't          d|j         d|j         d|j                   t          |j         t          j        t          j        t          j        f          st          d|j         z            | j                            |j         |j         |j         g          }| 	                    ||||g|          S )Nz#expected types to be the same, got r3   z'expected an floating point type, got %s)
r   r@   r>   r   HalfTyper^   r_   rA   rD   rE   )r   abcr   r)   r    s         r!   r"   z/_triop_intrinsic.<locals>.wrap.<locals>.wrapped   s    v16QV#3#3i ! ! !
  F^U_e6FGI I   =F   ..v7OPPB99R!QD111r#   rK   r%   rL   s     r!   r*   z_triop_intrinsic.<locals>.wrap   s=    				2 	2 	2 	2 	2 
		2  r#   r   rX   s   ` r!   _triop_intrinsicrn      s#        ( Kr#   c                       fd}|S )Nc                 J    t          j        |           dfd	            }|S )Nr   c                 t    |j         |k    r|S  | j        |||          }|                     |           |S r   )r   r   r   )r   valtypr   r   r   r    s        r!   r"   z&_castop.<locals>.wrap.<locals>.wrapped   sC    x3
C
FCd;;ELLLr#   rK   r%   r(   s     r!   r*   z_castop.<locals>.wrap   sB    				 	 	 	 	 	 
		 r#   r   r,   s   `` r!   _castoprt      s)    	 	 	 	 	 	 Kr#   c                 v    t          |           dk    r"d}d                    | d|         d|g          S | |z   S )zReturns (label + suffix) or a truncated version if it's too long.
    Parameters
    ----------
    label : str
        Label name
    suffix : str
        Label suffix
    2      r   Nz..)lenjoin)labelsuffixnheads      r!   _label_suffixr}      sC     5zzBwwfuftV4555v~r#   c                   	   e Zd ZddZed             ZeZed             Zed             Zd Z	d Z
d Zd	 ZddZd Zej        d             Zej        d             Zej        d             Zej        dd            Zej        dd            Zd Zd Z ed          dd            Z ed          dd            Z ed          dd            Z ed          dd            Z ed          dd            Z ed          dd            Z ed           dd!            Z ed"          dd#            Z  ed$          dd%            Z! ed&          dd'            Z" ed(          dd)            Z# ed*          dd+            Z$ ed,          dd-            Z% ed.          dd/            Z& ed0          dd1            Z' ed2          dd3            Z( ed4          dd5            Z) ed6          dd7            Z* e+d8          dd9            Z, e+d:          dd;            Z- e+d<          dd=            Z. e+d>          dd?            Z/ e+d@          ddA            Z0 e+dB          ddC            Z1ddDZ2ddEZ3 e4dF          ddH            Z5dI Z6ddJZ7ddKZ8ddLZ9ddMZ:ddNZ; e<dO          ddP            Z= e<dQ          ddR            Z> e<dS          ddT            Z? e<dU          ddV            Z@ e<dW          ddX            ZA e<dY          ddZ            ZB e<d[          dd\            ZC e<d]          dd^            ZD e<d_          dd`            ZE e<da          ddb            ZF e<dc          ddd            ZG e<de          ddf            ZH e<dg          ddh            ZIddiZJddjZKddkZLddlZMdm ZNdn ZOdo ZPdp ZQdq ZRdr ZSds ZTdt ZU	 	 ddvZVddwZWddxZXddyZY	 ddzZZdd{Z[dd|Z\dd}Z]dd~Z^ddZ_ddZ`ddZad ZbddZcddZdddZed ZfddZgd Zh eid          d             Zj eid          d             Zk eid          d             Zl emd          d             Zn emd          d             Zo epd          d             ZqddZr esd          d             ZtdS )	IRBuilderNc                 \    || _         |rt          |j                  nd| _        d | _        d S )Nr   )_blockrx   r   _anchordebug_metadatar   r   s     r!   __init__zIRBuilder.__init__   s3    27>s5-...Q"r#   c                     | j         S )z*
        The current basic block.
        )r   r   s    r!   r   zIRBuilder.block   s    
 {r#   c                     | j         j        S )z'
        The current function.
        )r   parentr   s    r!   functionzIRBuilder.function   s    
 z  r#   c                 $    | j         j        j        S )z%
        The current module.
        )r   r   rA   r   s    r!   rA   zIRBuilder.module   s    
 z ''r#   c                 f    |j         | _        | j        j                            |          | _        dS )z
        Position immediately before the given instruction.  The current block
        is also changed to the instruction's basic block.
        Nr   r   r   indexr   r   r   s     r!   position_beforezIRBuilder.position_before   s+    
 l{/55e<<r#   c                 l    |j         | _        | j        j                            |          dz   | _        dS )z
        Position immediately after the given instruction.  The current block
        is also changed to the instruction's basic block.
        r<   Nr   r   s     r!   position_afterzIRBuilder.position_after   s0    
 l{/55e<<q@r#   c                 "    || _         d| _        dS )z=
        Position at the start of the basic *block*.
        r   N)r   r   r   s     r!   position_at_startzIRBuilder.position_at_start   s     r#   c                 F    || _         t          |j                  | _        dS )z;
        Position at the end of the basic *block*.
        N)r   rx   r   r   r   s     r!   position_at_endzIRBuilder.position_at_end   s!     5-..r#   r   c                 6    | j                             |          S )z
        Append a basic block, with the given optional *name*, to the current
        function.  The current block is not changed.  The new block is returned.
        )r   append_basic_block)r   r   s     r!   r   zIRBuilder.append_basic_block   s    
 }//555r#   c                     | j         j                            |          }| j         j        |= | j         j        |k    rd| j         _        | j        |k    r| xj        dz  c_        dS dS )zRemove the given instruction.Nr<   )r   r   r   
terminatorr   )r   r   idxs      r!   removezIRBuilder.remove   sj    k&,,U33K$S);!U**%)DK"<#LLALLLL r#   c              #      K   | j         }|j        }||                     |           n|                     |           	 dV  |                     |           dS # |                     |           w xY w)z
        A context manager which temporarily positions the builder at the end
        of basic block *bb* (but before any terminator).
        N)basic_blockr   r   r   )r   r   	old_blockterms       r!   
goto_blockzIRBuilder.goto_block  s       $	  &&&&  '''	,EEE  +++++D  ++++s   A A1c              #      K   |                      | j        j                  5  dV  ddd           dS # 1 swxY w Y   dS )z}
        A context manager which temporarily positions the builder at the
        end of the function's entry block.
        N)r   r   entry_basic_blockr   s    r!   goto_entry_blockzIRBuilder.goto_entry_block  s       __T]<== 	 	EEE	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   488c              #      K   |                      |           |V  | j        j        |                     |           d S d S r   )r   r   r   branch)r   bbenterbbexits      r!   _branch_helperzIRBuilder._branch_helper"  sO      W%%%&.KK /.r#   c              #     K   | j         }|                     t          |j        d                    }|                     t          |j        d                    }|                     |||          }||                    |rddgnddg           |                     ||          5  |V  ddd           n# 1 swxY w Y   |                     |           dS )a  
        A context manager which sets up a conditional basic block based
        on the given predicate (a i1 value).  If the conditional block
        is not explicitly terminated, a branch will be added to the next
        block.
        If *likely* is given, its boolean value indicates whether the
        predicate is likely to be true or not, and metadata is issued
        for LLVM's optimizers to account for that.
        .ifr=   .endifNc   r<   r   r   r}   r   cbranchset_weightsr   r   )r   predlikelybbbbifbbendbrs          r!   if_thenzIRBuilder.if_then)  s"      &&M"'5,I,I&JJ'']27H-M-M'NN\\$e,,NNf9B771b':::  u-- 	 	KKK	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	U#####s   (B99B= B=c              #     K   | j         }|                     t          |j        d                    }|                     t          |j        d                    }|                     t          |j        d                    }|                     |||          }||                    |rddgnddg           |                     ||          }|                     ||          }	||	fV  |                     |           dS )a@  
        A context manager which sets up two conditional basic blocks based
        on the given predicate (a i1 value).
        A tuple of context managers is yield'ed.  Each context manager
        acts as a if_then() block.
        *likely* has the same meaning as in if_then().

        Typical use::
            with builder.if_else(pred) as (then, otherwise):
                with then:
                    # emit instructions for when the predicate is true
                with otherwise:
                    # emit instructions for when the predicate is false
        r   r=   z.elser   Nr   r<   r   )
r   r   r   r   r   bbelser   r   then	otherwises
             r!   if_elsezIRBuilder.if_else@  s       &&M"'5,I,I&JJ((mBGW.M.M(NN'']27H-M-M'NN\\$f--NNf9B771b':::""4//''66	IoU#####r#   c                     | j         d|j        vr| j         |j        d<   | j        j                            | j        |           | xj        dz  c_        d S )Ndbgr<   )r   metadatar   r   insertr   r   s     r!   r   zIRBuilder._insert_  sW    *uEN/J/J$($7EN5! ''e<<<r#   c                 d    | j         j        rJ |                     |           || j         _        |S r   )r   is_terminatedr   r   )r   r   s     r!   _set_terminatorzIRBuilder._set_terminatore  s4    :++++T $
r#   shlc                     dS )zC
        Left integer shift:
            name = lhs << rhs
        Nr   r   r6   r7   r   s       r!   r   zIRBuilder.shlo        r#   lshrc                     dS )zW
        Logical (unsigned) right integer shift:
            name = lhs >> rhs
        Nr   r   s       r!   r   zIRBuilder.lshrv  r   r#   ashrc                     dS )zX
        Arithmetic (signed) right integer shift:
            name = lhs >> rhs
        Nr   r   s       r!   r   zIRBuilder.ashr}  r   r#   addc                     dS )z@
        Integer addition:
            name = lhs + rhs
        Nr   r   s       r!   r   zIRBuilder.add  r   r#   faddc                     dS )zG
        Floating-point addition:
            name = lhs + rhs
        Nr   r   s       r!   r   zIRBuilder.fadd  r   r#   subc                     dS )zC
        Integer subtraction:
            name = lhs - rhs
        Nr   r   s       r!   r   zIRBuilder.sub  r   r#   fsubc                     dS )zJ
        Floating-point subtraction:
            name = lhs - rhs
        Nr   r   s       r!   r   zIRBuilder.fsub  r   r#   mulc                     dS )zF
        Integer multiplication:
            name = lhs * rhs
        Nr   r   s       r!   r   zIRBuilder.mul  r   r#   fmulc                     dS )zM
        Floating-point multiplication:
            name = lhs * rhs
        Nr   r   s       r!   r   zIRBuilder.fmul  r   r#   udivc                     dS )zI
        Unsigned integer division:
            name = lhs / rhs
        Nr   r   s       r!   r   zIRBuilder.udiv  r   r#   sdivc                     dS )zG
        Signed integer division:
            name = lhs / rhs
        Nr   r   s       r!   r   zIRBuilder.sdiv  r   r#   fdivc                     dS )zG
        Floating-point division:
            name = lhs / rhs
        Nr   r   s       r!   r   zIRBuilder.fdiv  r   r#   uremc                     dS )zJ
        Unsigned integer remainder:
            name = lhs % rhs
        Nr   r   s       r!   r   zIRBuilder.urem  r   r#   sremc                     dS )zH
        Signed integer remainder:
            name = lhs % rhs
        Nr   r   s       r!   r   zIRBuilder.srem  r   r#   fremc                     dS )zH
        Floating-point remainder:
            name = lhs % rhs
        Nr   r   s       r!   r   zIRBuilder.frem  r   r#   orc                     dS )zB
        Bitwise integer OR:
            name = lhs | rhs
        Nr   r   s       r!   or_zIRBuilder.or_  r   r#   andc                     dS )zC
        Bitwise integer AND:
            name = lhs & rhs
        Nr   r   s       r!   and_zIRBuilder.and_  r   r#   xorc                     dS )zC
        Bitwise integer XOR:
            name = lhs ^ rhs
        Nr   r   s       r!   r   zIRBuilder.xor  r   r#   saddc                     dS )zn
        Signed integer addition with overflow:
            name = {result, overflow bit} = lhs + rhs
        Nr   r   s       r!   sadd_with_overflowzIRBuilder.sadd_with_overflow  r   r#   smulc                     dS )zt
        Signed integer multiplication with overflow:
            name = {result, overflow bit} = lhs * rhs
        Nr   r   s       r!   smul_with_overflowzIRBuilder.smul_with_overflow  r   r#   ssubc                     dS )zq
        Signed integer subtraction with overflow:
            name = {result, overflow bit} = lhs - rhs
        Nr   r   s       r!   ssub_with_overflowzIRBuilder.ssub_with_overflow  r   r#   uaddc                     dS )zp
        Unsigned integer addition with overflow:
            name = {result, overflow bit} = lhs + rhs
        Nr   r   s       r!   uadd_with_overflowzIRBuilder.uadd_with_overflow  r   r#   umulc                     dS )zv
        Unsigned integer multiplication with overflow:
            name = {result, overflow bit} = lhs * rhs
        Nr   r   s       r!   umul_with_overflowzIRBuilder.umul_with_overflow	  r   r#   usubc                     dS )zs
        Unsigned integer subtraction with overflow:
            name = {result, overflow bit} = lhs - rhs
        Nr   r   s       r!   usub_with_overflowzIRBuilder.usub_with_overflow  r   r#   c                     t          |j        t          j                  r(t	          j        |j        d|j        j        z            }nt	          j        |j        d          }|                     |||          S )zG
        Bitwise integer complement:
            name = ~value
        )r   r=   )r>   r   r   
VectorTyper   Constantcountr   )r   valuer   r7   s       r!   not_zIRBuilder.not_  se    
 ej%"233 	2/%*eej6F.FGGCC/%*b11Cxxsx...r#   c                 b    |                      t          j        |j        d          ||          S )z=
        Integer negative:
            name = -value
        r   r=   )r   r   r  r   )r   r  r   s      r!   negzIRBuilder.neg&  s*    
 xx
A66DxIIIr#   fnegr   c                     dS )zB
        Floating-point negative:
            name = -arg
        Nr   )r   r   r   r   s       r!   r  zIRBuilder.fneg-  r   r#   c                     	 t           |         }n!# t          $ r t          d|d          w xY w|dvr||z   }t          j        | j        ||||          }|                     |           |S )Nzinvalid comparison z	 for icmp)r   r   r=   )_CMP_MAPKeyErrorr5   r   	ICMPInstrr   r   )r   prefixcmpopr6   r7   r   opr   s           r!   _icmpzIRBuilder._icmp8  s    	J%BB 	J 	J 	J*HIII	J$$"B&tz2sCdKKKUs    .c                 4    |                      d||||          S )z
        Signed integer comparison:
            name = lhs <cmpop> rhs

        where cmpop can be '==', '!=', '<', '<=', '>', '>='
        sr  r   r  r6   r7   r   s        r!   icmp_signedzIRBuilder.icmp_signedC       zz#uc3555r#   c                 4    |                      d||||          S )z
        Unsigned integer (or pointer) comparison:
            name = lhs <cmpop> rhs

        where cmpop can be '==', '!=', '<', '<=', '>', '>='
        ur  r  s        r!   icmp_unsignedzIRBuilder.icmp_unsignedL  r  r#   c                     |t           v rdt           |         z   }n|}t          j        | j        |||||          }|                     |           |S )z
        Floating-point ordered comparison:
            name = lhs <cmpop> rhs

        where cmpop can be '==', '!=', '<', '<=', '>', '>=', 'ord', 'uno'
        or   r   r
  r   	FCMPInstrr   r   r   r  r6   r7   r   r   r  r   s           r!   fcmp_orderedzIRBuilder.fcmp_orderedU  a     Hx&BBB&JC4u> > >Ur#   c                     |t           v rdt           |         z   }n|}t          j        | j        |||||          }|                     |           |S )z
        Floating-point unordered comparison:
            name = lhs <cmpop> rhs

        where cmpop can be '==', '!=', '<', '<=', '>', '>=', 'ord', 'uno'
        r  r  r  r  s           r!   fcmp_unorderedzIRBuilder.fcmp_unorderede  r!  r#   c                 n    t          j        | j        |||||          }|                     |           |S )zN
        Ternary select operator:
            name = cond ? lhs : rhs
        r  )r   SelectInstrr   r   )r   condr6   r7   r   r   r   s          r!   selectzIRBuilder.selectu  sA    
 (T3$/46 6 6Ur#   truncc                     dS )z_
        Truncating integer downcast to a smaller type:
            name = (typ) value
        Nr   r   r  rs   r   s       r!   r(  zIRBuilder.trunc  r   r#   zextc                     dS )z`
        Zero-extending integer upcast to a larger type:
            name = (typ) value
        Nr   r*  s       r!   r+  zIRBuilder.zext  r   r#   sextc                     dS )z`
        Sign-extending integer upcast to a larger type:
            name = (typ) value
        Nr   r*  s       r!   r-  zIRBuilder.sext  r   r#   fptruncc                     dS )z`
        Floating-point downcast to a less precise type:
            name = (typ) value
        Nr   r*  s       r!   r/  zIRBuilder.fptrunc  r   r#   fpextc                     dS )z^
        Floating-point upcast to a more precise type:
            name = (typ) value
        Nr   r*  s       r!   r1  zIRBuilder.fpext  r   r#   bitcastc                     dS )zZ
        Pointer cast to a different pointer type:
            name = (typ) value
        Nr   r*  s       r!   r3  zIRBuilder.bitcast  r   r#   addrspacecastc                     dS )z[
        Pointer cast to a different address space:
            name = (typ) value
        Nr   r*  s       r!   r5  zIRBuilder.addrspacecast  r   r#   fptouic                     dS )z\
        Convert floating-point to unsigned integer:
            name = (typ) value
        Nr   r*  s       r!   r7  zIRBuilder.fptoui  r   r#   uitofpc                     dS )z\
        Convert unsigned integer to floating-point:
            name = (typ) value
        Nr   r*  s       r!   r9  zIRBuilder.uitofp  r   r#   fptosic                     dS )zZ
        Convert floating-point to signed integer:
            name = (typ) value
        Nr   r*  s       r!   r;  zIRBuilder.fptosi  r   r#   sitofpc                     dS )zZ
        Convert signed integer to floating-point:
            name = (typ) value
        Nr   r*  s       r!   r=  zIRBuilder.sitofp  r   r#   ptrtointc                     dS )zI
        Cast pointer to integer:
            name = (typ) value
        Nr   r*  s       r!   r?  zIRBuilder.ptrtoint  r   r#   inttoptrc                     dS )zI
        Cast integer to pointer:
            name = (typ) value
        Nr   r*  s       r!   rA  zIRBuilder.inttoptr  r   r#   c                 L   |not          |t          j        t          j        f          r"t          |j        t
          j                  sJ n't          j        t          j        d          |          }t          j        | j	        |||          }| 
                    |           |S )zl
        Stack-allocate a slot for *size* elements of the given type.
        (default one element)
        N    )r>   r   Valuer  r   r   r?   r   AllocaInstrr   r   )r   rs   sizer   als        r!   allocazIRBuilder.alloca  s    
 <v|V_=>> 	<di777777 ?5=#4#4d;;D%dj#tTBBR	r#   c                    t          |j        t          j                  s(d}t	          ||j        t          |          fz            t          j        | j        |||          }||_	        | 
                    |           |S zf
        Load value from pointer, with optional guaranteed alignment:
            name = *ptr
        z5cannot load from value of type %s (%r): not a pointer)rs   )r>   r   r   PointerTyper@   strr   	LoadInstrr   alignr   )r   ptrr   rO  rs   msglds          r!   loadzIRBuilder.load  sy    
 #(E$566 	8ICC38SXX"66777#DJTsCCCR	r#   c                    t          |j        t          j                  s(d}t	          ||j        t          |          fz            |j        j        s5|j        j        |j        k    r t	          d|j        d|j        d          t          j	        | j
        ||          }||_        |                     |           |S ze
        Store value to pointer, with optional guaranteed alignment:
            *ptr = name
        z4cannot store to value of type %s (%r): not a pointerzcannot store z to z: mismatching types)r>   r   r   rL  r@   rM  	is_opaquepointeer   
StoreInstrr   rO  r   )r   r  rP  rO  rQ  sts         r!   storezIRBuilder.store  s    
 #(E$566 	8HCC38SXX"66777x! 	6ch&6%*&D&D)$zzz38885 6 6 6$TZ<<R	r#   c                     t          |j        t          j                  s(d}t	          ||j        t          |          fz            t          j        | j        |||||          }| 	                    |           |S rK  )
r>   r   r   rL  r@   rM  r   LoadAtomicInstrr   r   )r   rP  orderingrO  r   rs   rQ  rR  s           r!   load_atomiczIRBuilder.load_atomic  s}    
 #(E$566 	8ICC38SXX"66777)JXud= = =R	r#   c                 b   t          |j        t          j                  s(d}t	          ||j        t          |          fz            |j        j        |j        k    r t	          d|j        d|j        d          t          j        | j	        ||||          }| 
                    |           |S rU  )r>   r   r   rL  r@   rM  rW  r   StoreAtomicInstrr   r   )r   r  rP  r]  rO  rQ  rY  s          r!   store_atomiczIRBuilder.store_atomic  s    
 #(E$566 	8HCC38SXX"667778uz)))$zzz38885 6 6 6*JsHe5 5R	r#   c                 h    t          j        | j        d||          }|                     |           |S )zF
        Create a switch-case with a single *default* target.
        switch)r   SwitchInstrr   r   )r   r  defaultswts       r!   rc  zIRBuilder.switch2  s5     &tz8UGLLS!!!
r#   c                 h    t          j        | j        d|g          }|                     |           |S )z3
        Unconditional branch to *target*.
        r   r   Branchr   r   )r   targetr   s      r!   r   zIRBuilder.branch:  s5      TF8<<R   	r#   c                 l    t          j        | j        d|||g          }|                     |           |S )zV
        Conditional branch to *truebr* if *cond* is true, else to *falsebr*.
        r   )r   ConditionalBranchr   r   )r   r&  truebrfalsebrr   s        r!   r   zIRBuilder.cbranchB  sA     +DJ-167,CE ER   	r#   c                 f    t          j        | j        d|          }|                     |           |S )z3
        Indirect branch to target *addr*.
        
indirectbr)r   IndirectBranchr   r   )r   addrr   s      r!   branch_indirectzIRBuilder.branch_indirectK  s3     (\4HHR   	r#   c                 \    |                      t          j        | j        d                    S )z7
        Return from function without a value.
        zret voidr   r   Retr   r   s    r!   ret_voidzIRBuilder.ret_voidS  s.     ##TZ446 6 	6r#   c                 ^    |                      t          j        | j        d|                    S )z>
        Return from function with the given *value*.
        rJ   ru  )r   r  s     r!   rJ   zIRBuilder.retZ  s0     ##TZ668 8 	8r#   c                 h    t          j        | j        d|g          }|                     |           |S )z0
        Resume an in-flight exception.
        resumerh  )r   
landingpadr   s      r!   rz  zIRBuilder.resumea  s5      X
|DDR   	r#   Fc	                 t    t          j        | j        ||||||||	  	        }	|                     |	           |	S )zP
        Call function *fn* with *args*:
            name = fn(args...)
        )r   cconvtailfastmathattrs	arg_attrs)r   	CallInstrr   r   )
r   r)   argsr   r}  r~  r  r  r  insts
             r!   rE   zIRBuilder.callk  sM     %dj"d,1x,1YH H H 	Tr#   c                 ^    t          j        ||||          }|                     |||          S )z#
        Inline assembler.
        )r   	InlineAsmrE   )r   ftypeasm
constraintr  side_effectr   s          r!   r  zIRBuilder.asmw  s0     $UC[IIyydD)))r#   c                 f    t          j        |g           }|                     |dd|z  g d|          S )zo
        Load a register value into an LLVM value.
          Example: v = load_reg(IntType(32), "eax")
        r   z={%s}F)r   rB   r  )r   reg_typereg_namer   r  s        r!   load_regzIRBuilder.load_reg~  s7    
 "8R00xxr7X#5r5$GGGr#   c                     t          j        t          j                    |g          }|                     |dd|z  |gd|          S )z
        Store an LLVM value inside a register
        Example:
          store_reg(Constant(IntType(32), 0xAAAAAAAA), IntType(32), "eax")
        r   z{%s}T)r   rB   VoidTyper  )r   r  r  r  r   r  s         r!   	store_regzIRBuilder.store_reg  sC     "5>#3#3hZ@@xxr6H#4ugtTJJJr#   c
                 v    t          j        | j        |||||||||	
  
        }
|                     |
           |
S )N)r   r}  r  r  r  )r   InvokeInstrr   r   )r   r)   r  	normal_to	unwind_tor   r}  r  r  r  r  s              r!   invokezIRBuilder.invoke  sM    '
Bi(1E192;= = = 	T"""r#   c                 n    t          j        | j        |||||          }|                     |           |S )zo
        Compute effective address (getelementptr):
            name = getelementptr ptr, <indices...>
        )inboundsr   source_etype)r   GEPInstrr   r   )r   rP  indicesr  r   r  r   s          r!   gepzIRBuilder.gep  sG    
 %dj#w/7d3?A A A 	Ur#   c                 j    t          j        | j        |||          }|                     |           |S )z4
        Returns the value at position idx.
        r=   )r   ExtractElementr   r   )r   vectorr   r   r   s        r!   extract_elementzIRBuilder.extract_element  s6     +DJ$OOOUr#   c                 l    t          j        | j        ||||          }|                     |           |S )z
        Returns vector with vector[idx] replaced by value.
        The result is undefined if the idx is larger or equal the vector length.
        r=   )r   InsertElementr   r   )r   r  r  r   r   r   s         r!   insert_elementzIRBuilder.insert_element  s?    
 *4:vuc046 6 6Ur#   c                 l    t          j        | j        ||||          }|                     |           |S )a  
        Constructs a permutation of elements from *vector1* and *vector2*.
        Returns a new vector in the same length of *mask*.

        * *vector1* and *vector2* must have the same element type.
        * *mask* must be a constant vector of integer types.
        r=   )r   ShuffleVectorr   r   )r   vector1vector2maskr   r   s         r!   shuffle_vectorzIRBuilder.shuffle_vector  s?     *4:w046 6 6Ur#   c                     t          |t          t          f          s|g}t          j        | j        |||          }|                     |           |S )z=
        Extract member number *idx* from aggregate.
        r=   )r>   tuplelistr   ExtractValuer   r   )r   aggr   r   r   s        r!   extract_valuezIRBuilder.extract_value  sS     #t}-- 	%C)$*c3TJJJUr#   c                     t          |t          t          f          s|g}t          j        | j        ||||          }|                     |           |S )zI
        Insert *value* into member number *idx* from aggregate.
        r=   )r>   r  r  r   InsertValuer   r   )r   r  r  r   r   r   s         r!   insert_valuezIRBuilder.insert_value  sU     #t}-- 	%C(S%4PPPUr#   c                 j    t          j        | j        |||          }|                     |           |S )Nr  )r   PhiInstrr   r   )r   rs   r   r   r  s        r!   phizIRBuilder.phi  s4    $TZ4uMMMTr#   c                 b    t          j        | j                  }|                     |           |S r   )r   Unreachabler   r   )r   r  s     r!   unreachablezIRBuilder.unreachable  s-    '
33T"""r#   c                 n    t          j        | j        |||||          }|                     |           |S )Nr=   )r   	AtomicRMWr   r   )r   r  rP  rr   r]  r   r  s          r!   
atomic_rmwzIRBuilder.atomic_rmw  s?    %JChT; ; ;Tr#   c           	      |    ||n|}t          j        | j        ||||||          }|                     |           |S )a8  
        Atomic compared-and-set:
            atomic {
                old = *ptr
                success = (old == cmp)
                if (success)
                    *ptr = val
                }
            name = { old, success }

        If failordering is `None`, the value of `ordering` is used.
        Nr=   )r   CmpXchgr   r   )r   rP  cmprr   r]  failorderingr   r  s           r!   cmpxchgzIRBuilder.cmpxchg  sQ     $0#7xx\#DJS#x$0t= = =Tr#   c                 h    t          j        | j        |||          }|                     |           |S r   )r   LandingPadInstrr   r   )r   rs   r   cleanupr  s        r!   r{  zIRBuilder.landingpad  s1    +DJT7KKTr#   c                 d    | j                             d          }|                     ||g          S )z?
        Optimizer hint: assume *cond* is always true.
        zllvm.assume)rA   rD   rE   )r   r&  r)   s      r!   assumezIRBuilder.assume  s/     [**=99yydV$$$r#   c                 j    t          j        | j        |||          }|                     |           |S )z
        Add a memory barrier, preventing certain reorderings of load and/or
        store accesses with
        respect to other processors and devices.
        r=   )r   Fencer   r   )r   r]  targetscoper   r  s        r!   fencezIRBuilder.fence  s6     !$*h$OOOTr#   c                 d    t          j        | j        |          }|                     |           |S )a  
        Puts a single-line comment into the generated IR. This will be ignored
        by LLVM, but can be useful for debugging the output of a compiler. Adds
        a comment to the source file.

        * *text* is a string that does not contain new line characters.
        )r   Commentr   r   )r   textr  s      r!   commentzIRBuilder.comment  s/     #DJ55Tr#   z
llvm.bswapc                     dS )zv
        Used to byte swap integer values with an even number of bytes (positive
        multiple of 16 bits)
        Nr   r   r&  s     r!   bswapzIRBuilder.bswap%  r   r#   zllvm.bitreversec                     dS )zp
        Reverse the bitpattern of an integer value; for example 0b10110110
        becomes 0b01101101.
        Nr   r  s     r!   
bitreversezIRBuilder.bitreverse,  r   r#   z
llvm.ctpopc                     dS )z;
        Counts the number of bits set in a value.
        Nr   r  s     r!   ctpopzIRBuilder.ctpop3  r   r#   z	llvm.ctlzc                     dS )z
        Counts leading zero bits in *value*. Boolean *flag* indicates whether
        the result is defined for ``0``.
        Nr   r   r&  re   s      r!   ctlzzIRBuilder.ctlz9  r   r#   z	llvm.cttzc                     dS )z
        Counts trailing zero bits in *value*. Boolean *flag* indicates whether
        the result is defined for ``0``.
        Nr   r  s      r!   cttzzIRBuilder.cttz@  r   r#   zllvm.fmac                     dS )z;
        Perform the fused multiply-add operation.
        Nr   )r   rk   rl   rm   s       r!   fmazIRBuilder.fmaG  r   r#   c                    |st          d          t          |t          j        t          j        f          st          d|z            t          |j        t          j                  r|j        j        dk    st          d|j        z            d}| j        	                    ||g          }| 
                    ||g|          S )z:
        Convert from an i16 to the given FP type
        zexpected a float return typer]      zexpected an i16 type, got %szllvm.convert.from.fp16)r@   r>   r   r^   r_   r   r?   rd   rA   rD   rE   )r   rk   tor   r    r)   s         r!   convert_from_fp16zIRBuilder.convert_from_fp16M  s      	<:;;;"u0@ABB 	B;b@AAA165=11 	Eaflb6H6H:QVCDDD)[**6B488yyaS$'''r#   zllvm.convert.to.fp16c                     dS )z7
        Convert the given FP number to an i16
        Nr   )r   rk   s     r!   convert_to_fp16zIRBuilder.convert_to_fp16\  r   r#   r   rK   r$   )Nr   )r   NN)r   N)r   NFr   r   N)r   Nr   r   N)Fr   N)r   F)u__name__
__module____qualname__r   propertyr   r   r   rA   r   r   r   r   r   r   
contextlibcontextmanagerr   r   r   r   r   r   r   r8   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rM   r   r   r   r   r   r   r  r  r-   r  r  r  r  r   r#  r'  rt   r(  r+  r-  r/  r1  r3  r5  r7  r9  r;  r=  r?  rA  rI  rS  rZ  r^  ra  rc  r   r   rs  rw  rJ   rz  rE   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r{  r  r  r  rY   r  r  r  rf   r  r  rn   r  r  r`   r  r   r#   r!   r   r      s       # # # #
   X K! ! X! ( ( X(= = =A A A  / / /6 6 6 6   , , ,           $ $ $ $, $ $ $ $<     VE]]   ] VF^^   ^ VF^^   ^ VE]]   ] VF^^   ^ VE]]   ] VF^^   ^ VE]]   ] VF^^   ^ VF^^   ^ VF^^   ^ VF^^   ^ VF^^   ^ VF^^   ^ VF^^   ^ VD\\   \ VE]]   ] VE]]   ] &!!   "! &!!   "! &!!   "! &!!   "! &!!   "! &!!   "!	/ 	/ 	/ 	/J J J J U6]]   ]	 	 	6 6 6 66 6 6 6            WW    WV__   _ WV__   _ WY    WW    WY    W_    WX    WX    WX    WX    WZ    WZ      $            (        6 6 68 8 8   HJ!%
 
 
 
* * * *H H H HK K K K FJ   	 	 	 	                    
      &   
% % %   
 
 
 ,''  (' +,,  -, ,''  ('
  ,,  -,  ,,  -, j!!  "!
( ( ( ( 233  43  r#   r   )r  r&   llvmlite.irr   r   r   r
  Instructionr-   r8   rM   rR   rY   r`   rf   rn   	CastInstrrt   r}   objectr   r   r#   r!   <module>r     sp           3 3 3 3 3 3 3 3 3 3 
	



  #. 
 
 
 
 $/      &2%=    2 $/ 
 
 
 
       (  0 %.       c c c c c c c c c cr#   