
    Ǆgǂ                        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y)    N)instructionstypesvaluesgtlteqnegele)><==!=z>=z<=c                       fd}|S )Nc                 F    t        j                  |       dfd	       }|S )Nc                 n     | j                   |j                  |g||      }| j                  |       |S Nblocktype_insert)selfargnameflagsinstrclsopnames        [/home/mcse/projects/flask_80/flask-venv/lib/python3.12/site-packages/llvmlite/ir/builder.pywrappedz$_unop.<locals>.wrap.<locals>.wrapped   s2    

CHHfseT5IELLL      	functoolswrapsfnr    r   r   s     r   wrapz_unop.<locals>.wrap   %    			 
	
 r!   r$   r   r   r*   s   `` r   _unopr-           Kr!   c                       fd}|S )Nc                 F    t        j                  |       dfd	       }|S )Nc                     |j                   |j                   k7  r&t        d|j                   d|j                   d       | j                  |j                   ||f||      }| j                  |       |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   sc    xx388# $'HHchh"8 9 9

CHHfsCj$NELLLr!   r"   r%   r(   s     r   r*   z_binop.<locals>.wrap   s%    			 
	 r!   r$   r,   s   `` r   _binopr8      s    
 Kr!   c                       fd}|S )Nc                 D    t        j                  |       dfd	       }|S )Nc                    |j                   |j                   k7  r&t        d|j                   d|j                   d      |j                   }t        |t        j                        st        d|      t        j                  d      }| j                  }t        j                  t        j                  ||g      ||g      }|j                  d
d|g|      }| j                  |||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    xx388# $'HHchh"8 9 9Bb%--0b JKKmmA&G++C%%e&=&=r7m&L')2h0D&&&'J(*tT3B))Bc
)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                 F    t        j                  |       dfd	       }|S )Nc                 l     | j                   |j                  |g|      }| j                  |       |S r   r   )r   operandr   r   r   r   s       r   r    z%_uniop.<locals>.wrap.<locals>.wrappedH   s0    

GLL&7)T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                 D    t        j                  |       dfd	       }|S )Nc                     t        |j                  t        j                        st	        d|j                  z        | j
                  j                  |j                  g      }| j                  ||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   sd    gllEMM:6LL!" " ..v~FB99R'D11r!   rK   r%   rL   s     r   r*   z"_uniop_intrinsic_int.<locals>.wrapT   s%    			2 
	2 r!   r$   r   r*   s   ` r   _uniop_intrinsic_intrY   S   s    
 Kr!   c                       fd}|S )Nc                 D    t        j                  |       dfd	       }|S )Nc                    t        |j                  t        j                  t        j                  f      st        d|j                  z        | j                  j                  |j                  g      }| j                  ||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   sj    LL5??E4D4D"EG ?',, NOO..v~FB99R'D11r!   rK   r%   rL   s     r   r*   z$_uniop_intrinsic_float.<locals>.wrapd   s%    			2 
	2 r!   r$   rX   s   ` r   _uniop_intrinsic_floatr`   c   s    	 Kr!   c                       fd}|S )Nc                 D    t        j                  |       dfd	       }|S )Nc                    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                  |j                  g      }| j                  |||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    gllEMM:6LL!" " tyy%--8IIOOq( =		 IJJ..tyy13B99R'4$77r!   rK   r%   rL   s     r   r*   z(_uniop_intrinsic_with_flag.<locals>.wraps   s%    		
	8 

	8 r!   r$   rX   s   ` r   _uniop_intrinsic_with_flagrf   r   s      Kr!   c                       fd}|S )Nc                 D    t        j                  |       dfd	       }|S )Nc                 (   |j                   |j                   k7  s|j                   |j                   k7  r2t        d|j                   d|j                   d|j                         t        |j                   t        j                  t        j
                  t        j                  f      st        d|j                   z        | j                  j                  |j                   |j                   |j                   g      }| j                  ||||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    vv166QVV#3 ! !
  FF^^U__e6F6FGI  =FF  ..v7OPB99R!QD11r!   rK   r%   rL   s     r   r*   z_triop_intrinsic.<locals>.wrap   s%    			2 
	2  r!   r$   rX   s   ` r   _triop_intrinsicrn      s    ( Kr!   c                       fd}|S )Nc                 F    t        j                  |       dfd	       }|S )Nc                 x    |j                   |k(  r|S  | j                  |||      }| j                  |       |S r   )r   r   r   )r   valtypr   r   r   r   s        r   r    z&_castop.<locals>.wrap.<locals>.wrapped   s:    xx3


FCd;ELLLr!   rK   r%   r(   s     r   r*   z_castop.<locals>.wrap   s%    			 
	 r!   r$   r,   s   `` r   _castoprt      s    	 Kr!   c                 Z    t        |       dkD  rd}dj                  | 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}      s:     5zBwwfutV4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d/      dd0       Z' ed1      dd2       Z( ed3      dd4       Z) ed5      dd6       Z* e+d7      dd8       Z, e+d9      dd:       Z- e+d;      dd<       Z. e+d=      dd>       Z/ e+d?      dd@       Z0 e+dA      ddB       Z1ddCZ2ddDZ3 e4dE      ddF       Z5dG Z6ddHZ7ddIZ8ddJZ9ddKZ:ddLZ; e<dM      ddN       Z= e<dO      ddP       Z> e<dQ      ddR       Z? e<dS      ddT       Z@ e<dU      ddV       ZA e<dW      ddX       ZB e<dY      ddZ       ZC e<d[      dd\       ZD e<d]      dd^       ZE e<d_      dd`       ZF e<da      ddb       ZG e<dc      ddd       ZH e<de      ddf       ZIddgZJddhZKddiZLddjZMdk ZNdl ZOdm ZPdn ZQdo ZRdp ZSdq ZTdr ZU	 	 ddsZVddtZWdduZXddvZY	 ddwZZddxZ[ddyZ\ddz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        Zty)	IRBuilderNc                 \    || _         |rt        |j                        nd| _        d | _        y )Nr   )_blockrx   r   _anchordebug_metadatar   r   s     r   __init__zIRBuilder.__init__   s'    27s5--.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    
 zz   r!   c                 B    | j                   j                  j                  S )z%
        The current module.
        )r   r   rA   r   s    r   rA   zIRBuilder.module   s    
 zz  '''r!   c                 z    |j                   | _        | j                  j                  j                  |      | _        y)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+    
 ll{{//55e<r!   c                     |j                   | _        | j                  j                  j                  |      dz   | _        y)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    
 ll{{//55e<q@r!   c                      || _         d| _        y)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                        | _        y)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!   c                 8    | j                   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5r!   c                    | j                   j                  j                  |      }| j                   j                  |= | j                   j                  |k(  rd| j                   _        | j                  |kD  r| xj                  dz  c_        yy)zRemove the given instruction.Nr<   )r   r   r   
terminatorr   )r   r   idxs      r   removezIRBuilder.remove   sk    kk&&,,U3KK$$S);;!!U*%)DKK"<<#LLAL r!   c              #      K   | j                   }|j                  }|| j                  |       n| j                  |       	 d | j                  |       y# | j                  |       w xY w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  sd      $$	  &  '	,  +D  +s   >A-A A-A**A-c              #      K   | j                  | j                  j                        5  d ddd       y# 1 sw Y   yxY ww)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  s5      __T]]<<= 		 	 	s   &A6	A?Ac              #      K   | j                  |       | | j                  j                  | j                  |       y y wr   )r   r   r   branch)r   bbenterbbexits      r   _branch_helperzIRBuilder._branch_helper"  s<     W%&&.KK /s   ?Ac              #     K   | j                   }| j                  t        |j                  d            }| j                  t        |j                  d            }| j	                  |||      }||j                  |rddgnddg       | j                  ||      5  | ddd       | j                  |       y# 1 sw Y   xY ww)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&J'']277H-M'N\\$e,NNfB71b':  u- 	K	 	U#	 	s   BCB: C:C?Cc              #     K   | j                   }| j                  t        |j                  d            }| j                  t        |j                  d            }| j                  t        |j                  d            }| j	                  |||      }||j                  |rddgnddg       | j                  ||      }| j                  ||      }	||	f | j                  |       yw)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&J((mBGGW.M(N'']277H-M'N\\$f-NNfB71b':""4/''6	IoU#s   C)C+c                     | j                   'd|j                  vr| j                   |j                  d<   | j                  j                  j	                  | j
                  |       | xj
                  dz  c_        y )Ndbgr<   )r   metadatar   r   insertr   r   s     r   r   zIRBuilder._insert_  sY    *uENN/J$($7$7ENN5!  ''e<r!   c                 z    | j                   j                  rJ | j                  |       || j                   _        |S r   )r   is_terminatedr   r   )r   r   s     r   _set_terminatorzIRBuilder._set_terminatore  s2    ::++++T $

r!   shlc                      y)zC
        Left integer shift:
            name = lhs << rhs
        Nr$   r   r6   r7   r   s       r   r   zIRBuilder.shlo      r!   lshrc                      y)zW
        Logical (unsigned) right integer shift:
            name = lhs >> rhs
        Nr$   r   s       r   r   zIRBuilder.lshrv  r   r!   ashrc                      y)zX
        Arithmetic (signed) right integer shift:
            name = lhs >> rhs
        Nr$   r   s       r   r   zIRBuilder.ashr}  r   r!   addc                      y)z@
        Integer addition:
            name = lhs + rhs
        Nr$   r   s       r   r   zIRBuilder.add  r   r!   faddc                      y)zG
        Floating-point addition:
            name = lhs + rhs
        Nr$   r   s       r   r   zIRBuilder.fadd  r   r!   subc                      y)zC
        Integer subtraction:
            name = lhs - rhs
        Nr$   r   s       r   r   zIRBuilder.sub  r   r!   fsubc                      y)zJ
        Floating-point subtraction:
            name = lhs - rhs
        Nr$   r   s       r   r   zIRBuilder.fsub  r   r!   mulc                      y)zF
        Integer multiplication:
            name = lhs * rhs
        Nr$   r   s       r   r   zIRBuilder.mul  r   r!   fmulc                      y)zM
        Floating-point multiplication:
            name = lhs * rhs
        Nr$   r   s       r   r   zIRBuilder.fmul  r   r!   udivc                      y)zI
        Unsigned integer division:
            name = lhs / rhs
        Nr$   r   s       r   r   zIRBuilder.udiv  r   r!   sdivc                      y)zG
        Signed integer division:
            name = lhs / rhs
        Nr$   r   s       r   r   zIRBuilder.sdiv  r   r!   fdivc                      y)zG
        Floating-point division:
            name = lhs / rhs
        Nr$   r   s       r   r   zIRBuilder.fdiv  r   r!   uremc                      y)zJ
        Unsigned integer remainder:
            name = lhs % rhs
        Nr$   r   s       r   r   zIRBuilder.urem  r   r!   sremc                      y)zH
        Signed integer remainder:
            name = lhs % rhs
        Nr$   r   s       r   r   zIRBuilder.srem  r   r!   fremc                      y)zH
        Floating-point remainder:
            name = lhs % rhs
        Nr$   r   s       r   r   zIRBuilder.frem  r   r!   orc                      y)zB
        Bitwise integer OR:
            name = lhs | rhs
        Nr$   r   s       r   or_zIRBuilder.or_  r   r!   andc                      y)zC
        Bitwise integer AND:
            name = lhs & rhs
        Nr$   r   s       r   and_zIRBuilder.and_  r   r!   xorc                      y)zC
        Bitwise integer XOR:
            name = lhs ^ rhs
        Nr$   r   s       r   r   zIRBuilder.xor  r   r!   saddc                      y)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                      y)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                      y)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                      y)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                      y)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                      y)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                        r8t	        j
                  |j                  d|j                  j                  z        }n t	        j
                  |j                  d      }| j                  |||      S )zG
        Bitwise integer complement:
            name = ~value
        )r   r=   )r>   r   r   
VectorTyper   Constantcountr   )r   valuer   r7   s       r   not_zIRBuilder.not_  sd    
 ejj%"2"23//%**eejj6F6F.FGC//%**b1Cxxsx..r!   c                 f    | j                  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DxIIr!   fnegc                      y)zB
        Floating-point negative:
            name = -arg
        Nr$   )r   r   r   r   s       r   r  zIRBuilder.fneg-  r   r!   c                     	 t         |   }|dvr||z   }t        j                  | j
                  ||||      }| j                  |       |S # t        $ r t        d|d      w xY w)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  sr    	J%B $"B&&tzz2sCdKU  	JHII	Js   	A A$c                 ,    | j                  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5r!   c                 ,    | j                  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                  |||||      }| 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  Q     Hx&BB&&JJC4u>Ur!   c                     |t         v rdt         |   z   }n|}t        j                  | 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                 r    t        j                  | 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  s6    
 ((T3$/46Ur!   truncc                      y)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                      y)z`
        Zero-extending integer upcast to a larger type:
            name = (typ) value
        Nr$   r*  s       r   r+  zIRBuilder.zext  r   r!   sextc                      y)z`
        Sign-extending integer upcast to a larger type:
            name = (typ) value
        Nr$   r*  s       r   r-  zIRBuilder.sext  r   r!   fptruncc                      y)z`
        Floating-point downcast to a less precise type:
            name = (typ) value
        Nr$   r*  s       r   r/  zIRBuilder.fptrunc  r   r!   fpextc                      y)z^
        Floating-point upcast to a more precise type:
            name = (typ) value
        Nr$   r*  s       r   r1  zIRBuilder.fpext  r   r!   bitcastc                      y)zZ
        Pointer cast to a different pointer type:
            name = (typ) value
        Nr$   r*  s       r   r3  zIRBuilder.bitcast  r   r!   addrspacecastc                      y)z[
        Pointer cast to a different address space:
            name = (typ) value
        Nr$   r*  s       r   r5  zIRBuilder.addrspacecast  r   r!   fptouic                      y)z\
        Convert floating-point to unsigned integer:
            name = (typ) value
        Nr$   r*  s       r   r7  zIRBuilder.fptoui  r   r!   uitofpc                      y)z\
        Convert unsigned integer to floating-point:
            name = (typ) value
        Nr$   r*  s       r   r9  zIRBuilder.uitofp  r   r!   fptosic                      y)zZ
        Convert floating-point to signed integer:
            name = (typ) value
        Nr$   r*  s       r   r;  zIRBuilder.fptosi  r   r!   sitofpc                      y)zZ
        Convert signed integer to floating-point:
            name = (typ) value
        Nr$   r*  s       r   r=  zIRBuilder.sitofp  r   r!   ptrtointc                      y)zI
        Cast pointer to integer:
            name = (typ) value
        Nr$   r*  s       r   r?  zIRBuilder.ptrtoint  r   r!   inttoptrc                      y)zI
        Cast integer to pointer:
            name = (typ) value
        Nr$   r*  s       r   rA  zIRBuilder.inttoptr  r   r!   c                 d   |nyt        |t        j                  t        j                  f      r&t        |j                  t
        j                        s+J t        j                  t        j                  d      |      }t        j                  | j                  |||      }| j                  |       |S )zl
        Stack-allocate a slot for *size* elements of the given type.
        (default one element)
            )r>   r   Valuer  r   r   r?   r   AllocaInstrr   r   )r   rs   sizer   als        r   allocazIRBuilder.alloca  s    
 <v||V__=>dii777 ??5==#4d;D%%djj#tTBR	r!   c                 
   t        |j                  t        j                        s%d}t	        ||j                  t        |      fz        t        j                  | 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)r>   r   r   PointerTyper@   strr   	LoadInstrr   alignr   )r   ptrr   rO  msglds         r   loadzIRBuilder.load  sj    
 #((E$5$56ICC388SX"6677##DJJT:R	r!   c                    t        |j                  t        j                        s%d}t	        ||j                  t        |      fz        |j                  j                  |j                  k7  r&t	        d|j                  d|j                  d      t        j                  | 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  pointeer   
StoreInstrr   rO  r   )r   r  rP  rO  rQ  sts         r   storezIRBuilder.store  s    
 #((E$5$56HCC388SX"667788uzz)$zz3885 6 6$$TZZ<R	r!   c                     t        |j                  t        j                        s%d}t	        ||j                  t        |      fz        t        j                  | j                  ||||      }| j                  |       |S rK  )
r>   r   r   rL  r@   rM  r   LoadAtomicInstrr   r   )r   rP  orderingrO  r   rQ  rR  s          r   load_atomiczIRBuilder.load_atomic  sj    
 #((E$5$56ICC388SX"6677))JJXud4R	r!   c                    t        |j                  t        j                        s%d}t	        ||j                  t        |      fz        |j                  j                  |j                  k7  r&t	        d|j                  d|j                  d      t        j                  | j                  ||||      }| j                  |       |S rU  )r>   r   r   rL  r@   rM  rV  r   StoreAtomicInstrr   r   )r   r  rP  r\  rO  rQ  rX  s          r   store_atomiczIRBuilder.store_atomic  s    
 #((E$5$56HCC388SX"667788uzz)$zz3885 6 6**JJsHe5R	r!   c                 l    t        j                  | j                  d||      }| j                  |       |S )zF
        Create a switch-case with a single *default* target.
        switch)r   SwitchInstrr   r   )r   r  defaultswts       r   rb  zIRBuilder.switch2  s1     &&tzz8UGLS!
r!   c                 l    t        j                  | j                  d|g      }| j                  |       |S )z3
        Unconditional branch to *target*.
        r   r   Branchr   r   )r   targetr   s      r   r   zIRBuilder.branch:  s1       TF8<R 	r!   c                 p    t        j                  | j                  d|||g      }| j                  |       |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  s:     ++DJJ-167,CER 	r!   c                 j    t        j                  | j                  d|      }| j                  |       |S )z3
        Indirect branch to target *addr*.
        
indirectbr)r   IndirectBranchr   r   )r   addrr   s      r   branch_indirectzIRBuilder.branch_indirectK  s/     ((\4HR 	r!   c                 `    | j                  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+     ##TZZ46 	6r!   c                 b    | j                  t        j                  | j                  d|            S )z>
        Return from function with the given *value*.
        rJ   rt  )r   r  s     r   rJ   zIRBuilder.retZ  s-     ##TZZ68 	8r!   c                 l    t        j                  | j                  d|g      }| j                  |       |S )z0
        Resume an in-flight exception.
        resumerg  )r   
landingpadr   s      r   ry  zIRBuilder.resumea  s1       X
|DR 	r!   c	                 x    t        j                  | 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  s@     %%djj"d,1x,1YH 	Tr!   c                 X    t        j                  ||||      }| j                  |||      S )z#
        Inline assembler.
        )r   	InlineAsmrE   )r   ftypeasm
constraintr  side_effectr   s          r   r  zIRBuilder.asmw  s-     $$UC[IyydD))r!   c                 `    t        j                  |g       }| j                  |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~  s4    
 ""8R0xxr7X#5r5$GGr!   c                     t        j                  t        j                         |g      }| j                  |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  s?     ""5>>#3hZ@xxr6H#4ugtTJJr!   c
                 z    t        j                  | 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  sB    ''

Bi(1E192;= 	T"r!   c                 p    t        j                  | j                  ||||      }| j                  |       |S )zo
        Compute effective address (getelementptr):
            name = getelementptr ptr, <indices...>
        )inboundsr   )r   GEPInstrr   r   )r   rP  indicesr  r   r   s         r   gepzIRBuilder.gep  s5    
 %%djj#w/7dDUr!   c                 n    t        j                  | 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  s/     ++DJJ$OUr!   c                 p    t        j                  | 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  s4    
 **4::vuc046Ur!   c                 p    t        j                  | 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  s4     **4::w046Ur!   c                     t        |t        t        f      s|g}t        j                  | 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  sD     #t}-%C))$**c3TJUr!   c                     t        |t        t        f      s|g}t        j                  | 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  sF     #t}-%C((S%4PUr!   c                 n    t        j                  | j                  |||      }| j                  |       |S )Nr  )r   PhiInstrr   r   )r   rs   r   r   r  s        r   phizIRBuilder.phi  s-    $$TZZ4uMTr!   c                 f    t        j                  | j                        }| j                  |       |S r   )r   Unreachabler   r   )r   r  s     r   unreachablezIRBuilder.unreachable  s)    ''

3T"r!   c                 r    t        j                  | j                  |||||      }| j                  |       |S )Nr=   )r   	AtomicRMWr   r   )r   r  rP  rr   r\  r   r  s          r   
atomic_rmwzIRBuilder.atomic_rmw  s4    %%JJChT;Tr!   c           	          ||n|}t        j                  | 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.
        r=   )r   CmpXchgr   r   )r   rP  cmprr   r\  failorderingr   r  s           r   cmpxchgzIRBuilder.cmpxchg  sD     $0#7x\##DJJS#x$0t=Tr!   c                 l    t        j                  | j                  |||      }| j                  |       |S r   )r   LandingPadInstrr   r   )r   rs   r   cleanupr  s        r   rz  zIRBuilder.landingpad  s-    ++DJJT7KTr!   c                 ^    | j                   j                  d      }| j                  ||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yydV$$r!   c                 n    t        j                  | 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  s/     !!$**h$OTr!   c                 h    t        j                  | 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+     ##DJJ5Tr!   z
llvm.bswapc                      y)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                      y)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                      y)z;
        Counts the number of bits set in a value.
        Nr$   r  s     r   ctpopzIRBuilder.ctpop2  r   r!   z	llvm.ctlzc                      y)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.ctlz8  r   r!   z	llvm.cttzc                      y)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                      y)z;
        Perform the fused multiply-add operation.
        Nr$   )r   rk   rl   rm   s       r   fmazIRBuilder.fmaF  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                  j                  ||g      }| j                  ||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_fp16L  s     :;;"u0@0@AB;b@AA1665==1affllb6H:QVVCDD)[[**6B48yyaS$''r!   zllvm.convert.to.fp16c                      y)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#   N)r#   NFr$   r$   N)r#   Nr$   r$   N)Fr#   )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  rY  r]  r`  rb  r   r   rr  rv  rJ   ry  rE   r  r  r  r  r  r  r  r  r  r  r  r  r  r  rz  r  r  r  rY   r  r  r  rf   r  r  rn   r  r  r`   r  r$   r!   r   r   r      s!   #
   K! ! ( (=A/6 , ,        $ $, $ $< E]  F^  F^  E]  F^  E]  F^  E]  F^  F^  F^  F^  F^  F^  F^  D\  E]  E]  &! " &! " &! " &! " &! " &! "	/J 6] 	66   W  V_  V_  Y  W  Y  _  X  X  X  X  Z  Z $ (68 HJ!%
*HK FJ
&
%
 ,' ( +, - ,' (
  , -  , - j! "
( 23 4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     s      3 3 
	



 #.. 
 $//   &2%=%= 2 $// 
 (0 %..  b br!   