Ë
    øÇ:j\ƒ  ã                   ó  — 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        €€úh/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/llvmlite/ir/builder.pyÚwrappedz$_unop.<locals>.wrap.<locals>.wrapped   s2   ø€ á˜Ÿ
™
 C§H¡H¨f°s°e¸TÀ5ÓIˆEØ�L‰L˜ÔØˆ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   ø€ à�x‰x˜3Ÿ8™8Ò#Ý Ø$'§H£H¨c¯h«hð"8ó 9ð 9á˜Ÿ
™
 C§H¡H¨f°s¸C°jÀ$ÈÓNˆEØ�L‰L˜ÔØˆ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Ï   ø€ à�x‰x˜3Ÿ8™8Ò#Ý Ø$'§H£H¨c¯h«hð"8ó 9ð 9à—‘ˆBÜ˜b¤%§-¡-Ô0ÝÁbÐ JÓKÐKÜ—m‘m AÓ&ˆGà—+‘+ˆCÜ×%Ñ%¤e×&=Ñ&=¸rÀ7¸mÓ&LØ')¨2 hó0ˆDà×&Ò&Â&Ð'JØ(* t¨Tó3ˆBà—)‘)˜B  c 
°�)Ó6ˆCØˆ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   ø€ á˜Ÿ
™
 G§L¡L°&¸7¸)ÀTÓJˆEØ�L‰L˜ÔØˆ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   ø€ ä˜gŸl™l¬E¯M©MÔ:ÜØ6Ø—L‘Lñ!ó"ð "ð —‘×.Ñ.¨v¸¿¹°~ÓFˆBØ—9‘9˜R ' ¨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   ø€ äØ—L‘L¤5§?¡?´E×4DÑ4DÐ"EôGäÐ ?À'Ç,Á,Ñ NÓOÐOØ—‘×.Ñ.¨v¸¿¹°~ÓFˆBØ—9‘9˜R ' ¨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§   ø€ ä˜gŸl™l¬E¯M©MÔ:ÜØ6Ø—L‘Lñ!ó"ð "ô ˜tŸy™y¬%¯-©-Ô8Ø—I‘I—O‘O qÒ(ÜÐ =ÀÇ	Á	Ñ IÓJÐJØ—‘×.Ñ.Ø˜Ÿ™ t§y¡yÐ1ó3ˆBà—9‘9˜R '¨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Õ   ø€ à�v‰v˜Ÿ™Ò 1§6¡6¨Q¯V©VÒ#3ÝàŸ›ØŸ›ØŸšð ó!ð !ô
  Ø—F‘FÜ—^‘^¤U§_¡_´e×6FÑ6FÐGôIô  Ø=Ø—F‘Fñóð ð —‘×.Ñ.¨v¸¿¹ÀÇÁÈÏÉÐ7OÓPˆBØ—9‘9˜R ! 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:   ø€ à�x‰x˜3ŠØ�
Ù˜Ÿ
™
 F¨C°°dÓ;ˆEØ�L‰L˜ÔØˆ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 )z­Returns (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:   € ô ˆ5ƒz�B‚ØˆØ�w‰w˜˜f˜u˜ t¨VÐ4Ó5Ð5à�v‰~Ðr!   c                   ó˜  — e Zd Zd•d„Zed„ «       ZeZed„ «       Zed„ «       Zd„ Z	d„ Z
d„ Zd	„ Zd–d
„Zd„ Zej                   d„ «       Zej                   d„ «       Zej                   d„ «       Zej                   d•d„«       Zej                   d•d„«       Zd„ Zd„ Z ed«      d–d„«       Z ed«      d–d„«       Z ed«      d–d„«       Z ed«      d–d„«       Z ed«      d–d„«       Z ed«      d–d„«       Z ed«      d–d „«       Z ed!«      d–d"„«       Z  ed#«      d–d$„«       Z! ed%«      d–d&„«       Z" ed'«      d–d(„«       Z# ed)«      d–d*„«       Z$ ed+«      d–d,„«       Z% ed-«      d–d.„«       Z& ed/«      d–d0„«       Z' ed1«      d–d2„«       Z( ed3«      d–d4„«       Z) ed5«      d–d6„«       Z* e+d7«      d–d8„«       Z, e+d9«      d–d:„«       Z- e+d;«      d–d<„«       Z. e+d=«      d–d>„«       Z/ e+d?«      d–d@„«       Z0 e+dA«      d–dB„«       Z1d–dC„Z2d–dD„Z3 e4dE«      d—dF„«       Z5dG„ Z6d–dH„Z7d–dI„Z8d—dJ„Z9d—dK„Z:d—dL„Z; e<dM«      d–dN„«       Z= e<dO«      d–dP„«       Z> e<dQ«      d–dR„«       Z? e<dS«      d–dT„«       Z@ e<dU«      d–dV„«       ZA e<dW«      d–dX„«       ZB e<dY«      d–dZ„«       ZC e<d[«      d–d\„«       ZD e<d]«      d–d^„«       ZE e<d_«      d–d`„«       ZF e<da«      d–db„«       ZG e<dc«      d–dd„«       ZH e<de«      d–df„«       ZId˜dg„ZJd™dh„ZKd•di„ZLdšdj„ZMdk„ ZNdl„ ZOdm„ ZPdn„ ZQdo„ ZRdp„ ZSdq„ ZTdr„ ZU	 	 d›ds„ZVd–dt„ZWd–du„ZXd–dv„ZY	 dœdw„ZZd�dx„Z[d–dy„Z\d–dz„Z]d–d{„Z^d–d|„Z_d–d}„Z`d—d~„Zad„ Zbd–d€„Zcd˜d�„Zddžd‚„Zedƒ„ Zfd˜d„„Zgd…„ Zh eid†«      d‡„ «       Zj eidˆ«      d‰„ «       Zk eidŠ«      d‹„ «       Zl emdŒ«      d�„ «       Zn emdŽ«      d�„ «       Zo epd�«      d‘„ «       Zqd˜d’„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'   € ØˆŒÙ27”s˜5×-Ñ-Ô.¸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‰z× Ñ Ð r!   c                 óB   — | j                   j                  j                  S )z%
        The current module.
        )r   r‰   rA   r‡   s    r   rA   zIRBuilder.moduleÓ   s   € ð
 �z‰z× Ñ ×'Ñ'Ð'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+   € ð
 —l‘lˆŒØ—{‘{×/Ñ/×5Ñ5°eÓ<ˆ�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   € ð
 —l‘lˆŒØ—{‘{×/Ñ/×5Ñ5°eÓ<¸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   € à�k‰k×&Ñ&×,Ñ,¨UÓ3ˆØ�K‰K×$Ñ$ SÐ)Ø�;‰;×!Ñ! UÒ*Ø%)ˆD�K‰KÔ"Ø�<‰<˜#ÒØ�LŠL˜AÑŽ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Ô%ØŠØ×Ñ×&Ñ&Ð.Ø�K‰K˜Õð /ù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=   ú.endifNéc   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ˆØ×'Ñ'¬]¸2¿7¹7ÀHÓ-MÐ'ÓNˆØ�\‰\˜$  eÓ,ˆØÐØ�N‰N¡f˜B ™7°1°b°'Ô:à× Ñ   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ˆØ×(Ñ(¬m¸B¿G¹GÀWÓ.MÐ(ÓNˆØ×'Ñ'¬]¸2¿7¹7ÀHÓ-MÐ'ÓNˆØ�\‰\˜$  fÓ-ˆØÐØ�N‰N¡f˜B ™7°1°b°'Ô:à×"Ñ" 4¨Ó/ˆØ×'Ñ'¨°Ó6ˆ	à�IˆoÒà×Ñ˜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   € Ø×ÑÐ*¨u¸E¿N¹NÑ/JØ$(×$7Ñ$7ˆE�N‰N˜5Ñ!Ø�‰× Ñ ×'Ñ'¨¯©°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   € ô
 �e—j‘j¤%×"2Ñ"2Ô3Ü—/‘/ %§*¡*¨e°e·j±j×6FÑ6FÑ.FÓG‰Cä—/‘/ %§*¡*¨bÓ1ˆCØ�x‰x˜˜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(   € ð
 �x‰xœŸ™¨¯
©
°AÓ6¸ÀDˆxÓ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Ü×&Ñ& t§z¡z°2°s¸CÀdÔ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  ó   € ð �z‰z˜#˜u c¨3°Ó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Ü×&Ñ&Ø�J‰J˜˜C ¨4°uô>ˆà�‰�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   € ô
 ×(Ñ(¨¯©°T¸3ÀÈ$Ø/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¯_©_Ð=Ô>Ü˜dŸi™i¬¯©Ô7Ð7Ð7ô —?‘?¤5§=¡=°Ó#4°dÓ;ˆDä×%Ñ% d§j¡j°#°t¸TÓ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)rs   )r>   r   r   ÚPointerTyper@   Ústrr   Ú	LoadInstrr   Úalignr   )r   Úptrr   rO  rs   ÚmsgÚlds          r   ÚloadzIRBuilder.loadô  sl   € ô
 ˜#Ÿ(™(¤E×$5Ñ$5Ô6ØIˆCÜ˜C 3§8¡8¬S°«XÐ"6Ñ6Ó7Ð7Ü×#Ñ# D§J¡J°°T¸sÔCˆØˆŒØ�‰�RÔØˆ	r!   c                 óÈ  — t        |j                  t        j                  «      s%d}t	        ||j                  t        |«      fz  «      ‚|j                  j                  sI|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  Ú	is_opaqueÚpointeer   Ú
StoreInstrr   rO  r   )r   r  rP  rO  rQ  Ústs         r   ÚstorezIRBuilder.store  s«   € ô
 ˜#Ÿ(™(¤E×$5Ñ$5Ô6ØHˆCÜ˜C 3§8¡8¬S°«XÐ"6Ñ6Ó7Ð7Ø�x‰x×!Ò! c§h¡h×&6Ñ&6¸%¿*¹*Ò&DÝØ$Ÿz›z¨3¯8«8ð5ó 6ð 6ä×$Ñ$ T§Z¡Z°¸Ó<ˆØˆŒØ�‰�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   rs   rQ  rR  s           r   Úload_atomiczIRBuilder.load_atomic  sl   € ô
 ˜#Ÿ(™(¤E×$5Ñ$5Ô6ØIˆCÜ˜C 3§8¡8¬S°«XÐ"6Ñ6Ó7Ð7Ü×)Ñ)Ø�J‰J˜˜X u¨d¸ô=ˆà�‰�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  rW  r   ÚStoreAtomicInstrr   r   )r   r  rP  r]  rO  rQ  rY  s          r   Ústore_atomiczIRBuilder.store_atomic  sŸ   € ô
 ˜#Ÿ(™(¤E×$5Ñ$5Ô6ØHˆCÜ˜C 3§8¡8¬S°«XÐ"6Ñ6Ó7Ð7Ø�8‰8×Ñ˜uŸz™zÒ)ÝØ$Ÿz›z¨3¯8«8ð5ó 6ð 6ä×*Ñ*Ø�J‰J˜˜s H¨eó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   rc  zIRBuilder.switch2  s1   € ô ×&Ñ& t§z¡z°8¸UÀGÓ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   € ô × Ñ  §¡¨T°F°8Ó<ˆØ×Ñ˜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:   € ô ×+Ñ+¨D¯J©J¸Ø-1°6¸7Ð,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+   € ð ×#Ñ#Ü×Ñ˜TŸZ™Z¨Ó4ó6ð 	6r!   c                 ób   — | j                  t        j                  | j                  d|«      «      S )z>
        Return from function with the given *value*.
        rJ   ru  )r   r  s     r   rJ   zIRBuilder.retZ  s-   € ð ×#Ñ#Ü×Ñ˜TŸZ™Z¨°Ó6ó8ð 	8r!   c                 ól   — t        j                  | j                  d|g«      }| j                  |«       |S )z0
        Resume an in-flight exception.
        Úresumerh  )r   Ú
landingpadr¶   s      r   rz  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@   € ô ×%Ñ% d§j¡j°"°dÀØ,1¸ÀxØ,1¸Yô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-   € ô ×$Ñ$ U¨C°¸[ÓIˆØ�y‰y˜˜d DÓ)Ð)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   € ô
 ×"Ñ" 8¨RÓ0ˆØ�x‰x˜˜r 7¨XÑ#5°r¸5À$Ó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§>¡>Ó#3°h°ZÓ@ˆØ�x‰x˜˜r 6¨HÑ#4°u°g¸tÀTÓ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¸ÀEØ19ÀØ2;ô=ˆð 	×Ñ˜TÔ"Øˆr!   c                 ór   — t        j                  | 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š  s:   € ô
 ×%Ñ% d§j¡j°#°wØ/7¸dØ3?ôAˆð 	�‰�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/   € ô ×+Ñ+¨D¯J©J¸ÀÈ$Ô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¯:©:°v¸uÀcØ04ô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Ü×)Ñ)¨$¯*©*°c¸3ÀTÔ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-   € Ü×$Ñ$ T§Z¡Z°¸4ÀuÔ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   € Ü×%Ñ%Ø�J‰J˜˜C  h°Tô;ˆà�‰�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Ð#7‘x¸\ˆÜ×#Ñ# D§J¡J°°S¸#¸xØ$0°tô=ˆà�‰�TÔØˆr!   c                 ól   — t        j                  | j                  |||«      }| j                  |«       |S r   )r   ÚLandingPadInstrr   r   )r   rs   r   Úcleanupr„  s        r   r{  zIRBuilder.landingpad  s-   € Ü×+Ñ+¨D¯J©J¸¸TÀ7Ó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ˆØ�y‰y˜˜d˜VÓ$Ð$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+   € ô ×#Ñ# D§J¡J°Ó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.ctpop3  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.ctlz9  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.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                  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_fp16M  s¥   € ñ ÜÐ:Ó;Ð;Ü˜"œuŸ™´×0@Ñ0@ÐAÔBÜÐ;¸bÑ@ÓAÐAÜ˜1Ÿ6™6¤5§=¡=Ô1°a·f±f·l±lÀbÒ6HÜÐ:¸Q¿V¹VÑCÓDÐDà)ˆØ�[‰[×*Ñ*¨6°B°4Ó8ˆØ�y‰y˜˜a˜S $Ó'Ð'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#   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!  „ ó#ð
 ñó ðð €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 %×.Ñ.ó òô c�õ cr!   