
C]c           @@ s   d  d l  m Z m Z d  d l Z d  d l Z d d l m Z m Z m Z i d d 6d d 6d	 d
 6d d 6d d 6d d 6Z	 e j
 d  Z e j
 d  Z e j
 d  Z d   Z d   Z d   Z e j d  Z d   Z d e f d     YZ d S(   i    (   t   print_functiont   absolute_importNi   (   t   instructionst   typest   valuest   gtt   >t   ltt   <t   eqs   ==t   nes   !=t   ges   >=t   les   <=c         @ s      f d   } | S(   Nc         @ s+   t  j |   d d    f d   } | S(   Nt    c         @ si   | j  | j  k r1 t d | j  | j  f   n    |  j | j   | | f | |  } |  j |  | S(   Ns,   Operands must be the same type, got (%s, %s)(   t   typet
   ValueErrort   blockt   _insert(   t   selft   lhst   rhst   namet   flagst   instr(   t   clst   opname(    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   wrapped   s    '(    (   t	   functoolst   wraps(   t   fnR   (   R   R   (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   wrap   s    (    (   R   R   R   (    (   R   R   s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   _binop   s    c         @ s     f d   } | S(   Nc         @ s%   t  j |   d   f d   } | S(   NR   c   
      @ s   | j  | j  k r1 t d | j  | j  f   n  | j  } t | t j  sb t d | f   n  t j d  } |  j } t j t j | | g  | | g  } | j	 d   f | g |  } |  j
 | | | g d | }	 |	 S(   Ns,   Operands must be the same type, got (%s, %s)s    expected an integer type, got %si   s   llvm.%s.with.overflowR   (   R   R   t
   isinstanceR   t   IntTypet	   TypeErrort   modulet   FunctionTypet   LiteralStructTypet   declare_intrinsict   call(
   R   R   R   R   t   tyt   bool_tyt   modt   fntyR   t   ret(   R   (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   $   s    		(   R   R   (   R   R   (   R   (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   #   s    (    (   R   R   R   (    (   R   s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   _binop_with_overflow"   s    c         @ s      f d   } | S(   Nc         @ s(   t  j |   d    f d   } | S(   NR   c         @ s2     |  j  | j  | g |  } |  j |  | S(   N(   R   R   R   (   R   t   operandR   R   (   R   R   (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   =   s    !(   R   R   (   R   R   (   R   R   (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   <   s    (    (   R   R   R   (    (   R   R   s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   _uniop;   s    	c         @ s     f d   } | S(   Nc         @ s%   t  j |   d   f d   } | S(   NR   c         @ s\   t  | j t j  s+ t d | j   n  |  j j   | j g  } |  j | | g |  S(   Ns    expected an integer type, got %s(   R    R   R   R!   R"   R#   R&   R'   (   R   R.   R   R   (   R   (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   J   s    (   R   R   (   R   R   (   R   (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   I   s    (    (   R   R   (    (   R   s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   _uniop_intrinsicH   s    
c         @ s     f d   } | S(   Nc         @ s%   t  j |   d   f d   } | S(   NR   c         @ s   t  | j t j  s+ t d | j   n  | j t j d  k rY t d | j   n  |  j j   | j | j g  } |  j | | | g |  S(   Ns    expected an integer type, got %si   s   expected an i1 type, got %s(   R    R   R   R!   R"   R#   R&   R'   (   R   R.   t   flagR   R   (   R   (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   X   s    !(   R   R   (   R   R   (   R   (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   W   s    (    (   R   R   (    (   R   s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   _uniop_intrinsic_with_flagV   s    c         @ s     f d   } | S(   Nc         @ s%   t  j |   d   f d   } | S(   NR   c         @ s   | j  | j  k s$ | j  | j  k rI t d | j  | j  | j  f   n4 t | j  t j t j f  s} t d | j    n  |  j j   | j  | j  | j  g  } |  j | | | | g |  S(   Ns-   expected types to be the same, got %s, %s, %ss'   expected an floating point type, got %s(	   R   R"   R    R   t	   FloatTypet
   DoubleTypeR#   R&   R'   (   R   t   at   bt   cR   R   (   R   (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   h   s    $'(   R   R   (   R   R   (   R   (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   g   s    (    (   R   R   (    (   R   s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   _triop_intrinsicf   s    c         @ s      f d   } | S(   Nc         @ s(   t  j |   d    f d   } | S(   NR   c         @ s?   | j  | k r | S  |  j  | | |  } |  j |  | S(   N(   R   R   R   (   R   t   valt   typR   R   (   R   R   (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   |   s
    (   R   R   (   R   R   (   R   R   (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   {   s    (    (   R   R   R   (    (   R   R   s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   _castopz   s    c         C@ s>   t  |   d k r2 d } d j |  |  d | g  S|  | Sd S(   s   Returns (label + suffix) or a truncated version if it's too long.
    Parameters
    ----------
    label : str
        Label name
    suffix : str
        Label suffix
    i2   i   R   s   ..N(   t   lent   join(   t   labelt   suffixt   nhead(    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   _label_suffix   s    	t	   IRBuilderc           B@ s  e  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 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 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 d dA  Z1 d dB  Z2 dC   Z3 d dD  Z4 d dE  Z5 d g  dF  Z6 d g  dG  Z7 d dH  Z8 e9 dI  d dJ   Z: e9 dK  d dL   Z; e9 dM  d dN   Z< e9 dO  d dP   Z= e9 dQ  d dR   Z> e9 dS  d dT   Z? e9 dU  d dV   Z@ e9 dW  d dX   ZA e9 dY  d dZ   ZB e9 d[  d d\   ZC e9 d]  d d^   ZD e9 d_  d d`   ZE e9 da  d db   ZF d d dc  ZG d d dd  ZH d de  ZI d df  ZJ dg   ZK dh   ZL di   ZM dj   ZN dk   ZO dl   ZP dm   ZQ dn   ZR d d eS d do  ZT d dp  ZU d dq  ZV d dr  ZW d d eS ds  ZX eS d dt  ZY d du  ZZ d dv  Z[ d dw  Z\ d dx  Z] d dy  Z^ d dz  Z_ d{   Z` d d|  Za d d d}  Zb d eS d~  Zc d   Zd d d d  Ze ef d  d    Zg ef d  d    Zh ef d  d    Zi ej d  d    Zk ej d  d    Zl em d  d    Zn RS(   c         C@ s4   | |  _  | r t | j  n d |  _ d  |  _ d  S(   Ni    (   t   _blockR<   R   t   _anchort   Nonet   debug_metadata(   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   __init__   s    	c         C@ s   |  j  S(   s*   
        The current basic block.
        (   RC   (   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR      s    c         C@ s
   |  j  j S(   s'   
        The current function.
        (   R   t   parent(   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   function   s    c         C@ s   |  j  j j S(   s%   
        The current module.
        (   R   RH   R#   (   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR#      s    c         C@ s(   | j  |  _ |  j j j |  |  _ d S(   s   
        Position immediately before the given instruction.  The current block
        is also changed to the instruction's basic block.
        N(   RH   RC   R   t   indexRD   (   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   position_before   s    c         C@ s,   | j  |  _ |  j j j |  d |  _ d S(   s   
        Position immediately after the given instruction.  The current block
        is also changed to the instruction's basic block.
        i   N(   RH   RC   R   RJ   RD   (   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   position_after   s    c         C@ s   | |  _  d |  _ d S(   s=   
        Position at the start of the basic *block*.
        i    N(   RC   RD   (   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   position_at_start   s    	c         C@ s   | |  _  t | j  |  _ d S(   s;   
        Position at the end of the basic *block*.
        N(   RC   R<   R   RD   (   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   position_at_end   s    	R   c         C@ s   |  j  j |  S(   s   
        Append a basic block, with the given optional *name*, to the current
        function.  The current block is not changed.  The new block is returned.
        (   RI   t   append_basic_block(   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyRO      s    c         c@ sY   |  j  } | j } | d k	 r. |  j |  n |  j |  z	 d VWd |  j |  Xd S(   s   
        A context manager which temporarily positions the builder at the end
        of basic block *bb* (but before any terminator).
        N(   t   basic_blockt
   terminatorRE   RK   RN   (   R   R   t	   old_blockt   term(    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt
   goto_block   s    			c         c@ s%   |  j  |  j j  
 d VWd QXd S(   s}   
        A context manager which temporarily positions the builder at the
        end of the function's entry block.
        N(   RT   RI   t   entry_basic_block(   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   goto_entry_block   s    c         c@ s8   |  j  |  | V|  j j d  k r4 |  j |  n  d  S(   N(   RN   RP   RQ   RE   t   branch(   R   t   bbentert   bbexit(    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   _branch_helper   s    c         c@ s   |  j  } |  j d t | j d   } |  j d t | j d   } |  j | | |  } | d k	 r | j | r~ d d g n	 d d g  n  |  j | |  
 | VWd QX|  j |  d S(   s  
        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.
        R   s   .ifs   .endific   i   N(	   RP   RO   RA   R   t   cbranchRE   t   set_weightsRZ   RN   (   R   t   predt   likelyt   bbt   bbift   bbendt   br(    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   if_then   s    	(c   
      c@ s   |  j  } |  j d t | j d   } |  j d t | j d   } |  j d t | j d   } |  j | | |  } | d k	 r | j | r d d g n	 d d g  n  |  j | |  } |  j | |  }	 | |	 f V|  j |  d S(   s@  
        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   s   .ifs   .elses   .endific   i   N(	   RP   RO   RA   R   R[   RE   R\   RZ   RN   (
   R   R]   R^   R_   R`   t   bbelseRa   Rb   t   thent	   otherwise(    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   if_else  s    	(c         C@ s]   |  j  d  k	 r1 d | j k r1 |  j  | j d <n  |  j j j |  j |  |  j d 7_ d  S(   Nt   dbgi   (   RF   RE   t   metadataRC   R   t   insertRD   (   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   2  s    c         C@ s0   |  j  j s t  |  j |  | |  j  _ | S(   N(   R   t   is_terminatedt   AssertionErrorR   RQ   (   R   RS   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   _set_terminator8  s    t   shlc         C@ s   d S(   sC   
        Left integer shift:
            name = lhs << rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyRn   B  R   t   lshrc         C@ s   d S(   sW   
        Logical (unsigned) right integer shift:
            name = lhs >> rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyRo   I  R   t   ashrc         C@ s   d S(   sX   
        Arithmetic (signed) right integer shift:
            name = lhs >> rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyRp   P  R   t   addc         C@ s   d S(   s@   
        Integer addition:
            name = lhs + rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyRq   W  R   t   faddc         C@ s   d S(   sG   
        Floating-point addition:
            name = lhs + rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyRr   ^  R   t   subc         C@ s   d S(   sC   
        Integer subtraction:
            name = lhs - rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyRs   e  R   t   fsubc         C@ s   d S(   sJ   
        Floating-point subtraction:
            name = lhs - rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyRt   l  R   t   mulc         C@ s   d S(   sF   
        Integer multiplication:
            name = lhs * rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyRu   s  R   t   fmulc         C@ s   d S(   sM   
        Floating-point multiplication:
            name = lhs * rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyRv   z  R   t   udivc         C@ s   d S(   sI   
        Unsigned integer division:
            name = lhs / rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyRw     R   t   sdivc         C@ s   d S(   sG   
        Signed integer division:
            name = lhs / rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyRx     R   t   fdivc         C@ s   d S(   sG   
        Floating-point division:
            name = lhs / rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyRy     R   t   uremc         C@ s   d S(   sJ   
        Unsigned integer remainder:
            name = lhs % rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyRz     R   t   sremc         C@ s   d S(   sH   
        Signed integer remainder:
            name = lhs % rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR{     R   t   fremc         C@ s   d S(   sH   
        Floating-point remainder:
            name = lhs % rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR|     R   t   orc         C@ s   d S(   sB   
        Bitwise integer OR:
            name = lhs | rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   or_  R   t   andc         C@ s   d S(   sC   
        Bitwise integer AND:
            name = lhs & rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   and_  R   t   xorc         C@ s   d S(   sC   
        Bitwise integer XOR:
            name = lhs ^ rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR     R   t   saddc         C@ s   d S(   sn   
        Signed integer addition with overflow:
            name = {result, overflow bit} = lhs + rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   sadd_with_overflow  R   t   smulc         C@ s   d S(   st   
        Signed integer multiplication with overflow:
            name = {result, overflow bit} = lhs * rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   smul_with_overflow  R   t   ssubc         C@ s   d S(   sq   
        Signed integer subtraction with overflow:
            name = {result, overflow bit} = lhs - rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   ssub_with_overflow  R   t   uaddc         C@ s   d S(   sp   
        Unsigned integer addition with overflow:
            name = {result, overflow bit} = lhs + rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   uadd_with_overflow  R   t   umulc         C@ s   d S(   sv   
        Unsigned integer multiplication with overflow:
            name = {result, overflow bit} = lhs * rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   umul_with_overflow  R   t   usubc         C@ s   d S(   ss   
        Unsigned integer subtraction with overflow:
            name = {result, overflow bit} = lhs - rhs
        N(    (   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   usub_with_overflow  R   c         C@ sb   t  | j t j  r7 t j | j d | j j  } n t j | j d  } |  j | | d | S(   sG   
        Bitwise integer complement:
            name = ~value
        iR   (   i(   R    R   R   t
   VectorTypeR   t   Constantt   countR   (   R   t   valueR   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   not_  s    "c         C@ s%   |  j  t j | j d  | d | S(   s=   
        Integer negative:
            name = -value
        i    R   (   Rs   R   R   R   (   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   neg  s    c         C@ s   y t  | } Wn$ t k
 r4 t d | f   n X| d k rN | | } n  t j |  j | | | d | } |  j |  | S(   Ns   invalid comparison %r for icmps   ==s   !=R   (   s   ==s   !=(   t   _CMP_MAPt   KeyErrorR   R   t	   ICMPInstrR   R   (   R   t   prefixt   cmpopR   R   R   t   opR   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   _icmp  s    !c         C@ s   |  j  d | | | |  S(   s   
        Signed integer comparison:
            name = lhs <cmpop> rhs

        where cmpop can be '==', '!=', '<', '<=', '>', '>='
        t   s(   R   (   R   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   icmp_signed  s    c         C@ s   |  j  d | | | |  S(   s   
        Unsigned integer (or pointer) comparison:
            name = lhs <cmpop> rhs

        where cmpop can be '==', '!=', '<', '<=', '>', '>='
        t   u(   R   (   R   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   icmp_unsigned  s    c      	   C@ s[   | t  k r d t  | } n | } t j |  j | | | d | d | } |  j |  | S(   s   
        Floating-point ordered comparison:
            name = lhs <cmpop> rhs

        where cmpop can be '==', '!=', '<', '<=', '>', '>=', 'ord', 'uno'
        t   oR   R   (   R   R   t	   FCMPInstrR   R   (   R   R   R   R   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   fcmp_ordered!  s    'c      	   C@ s[   | t  k r d t  | } n | } t j |  j | | | d | d | } |  j |  | S(   s   
        Floating-point unordered comparison:
            name = lhs <cmpop> rhs

        where cmpop can be '==', '!=', '<', '<=', '>', '>=', 'ord', 'uno'
        R   R   R   (   R   R   R   R   R   (   R   R   R   R   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   fcmp_unordered0  s    'c         C@ s2   t  j |  j | | | d | } |  j |  | S(   sN   
        Ternary select operator:
            name = cond ? lhs : rhs
        R   (   R   t   SelectInstrR   R   (   R   t   condR   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   select?  s    !t   truncc         C@ s   d S(   s_   
        Truncating integer downcast to a smaller type:
            name = (typ) value
        N(    (   R   R   R:   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   L  R   t   zextc         C@ s   d S(   s`   
        Zero-extending integer upcast to a larger type:
            name = (typ) value
        N(    (   R   R   R:   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   S  R   t   sextc         C@ s   d S(   s`   
        Sign-extending integer upcast to a larger type:
            name = (typ) value
        N(    (   R   R   R:   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   Z  R   t   fptruncc         C@ s   d S(   s`   
        Floating-point downcast to a less precise type:
            name = (typ) value
        N(    (   R   R   R:   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   a  R   t   fpextc         C@ s   d S(   s^   
        Floating-point upcast to a more precise type:
            name = (typ) value
        N(    (   R   R   R:   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   h  R   t   bitcastc         C@ s   d S(   sZ   
        Pointer cast to a different pointer type:
            name = (typ) value
        N(    (   R   R   R:   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   o  R   t   addrspacecastc         C@ s   d S(   s[   
        Pointer cast to a different address space:
            name = (typ) value
        N(    (   R   R   R:   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   v  R   t   fptouic         C@ s   d S(   s\   
        Convert floating-point to unsigned integer:
            name = (typ) value
        N(    (   R   R   R:   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   }  R   t   uitofpc         C@ s   d S(   s\   
        Convert unsigned integer to floating-point:
            name = (typ) value
        N(    (   R   R   R:   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR     R   t   fptosic         C@ s   d S(   sZ   
        Convert floating-point to signed integer:
            name = (typ) value
        N(    (   R   R   R:   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR     R   t   sitofpc         C@ s   d S(   sZ   
        Convert signed integer to floating-point:
            name = (typ) value
        N(    (   R   R   R:   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR     R   t   ptrtointc         C@ s   d S(   sI   
        Cast pointer to integer:
            name = (typ) value
        N(    (   R   R   R:   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR     R   t   inttoptrc         C@ s   d S(   sI   
        Cast integer to pointer:
            name = (typ) value
        N(    (   R   R   R:   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR     R   c         C@ s   | d k r nT t | t j t j f  rH t | j t j  sc t  n t j t j d  |  } t	 j
 |  j | | |  } |  j |  | S(   sl   
        Stack-allocate a slot for *size* elements of the given type.
        (default one element)
        i    N(   RE   R    R   t   ValueR   R   R   R!   Rl   R   t   AllocaInstrR   R   (   R   R:   t   sizeR   t   al(    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   alloca  s    c         C@ si   t  | j t j  s7 t d | j t |  f   n  t j |  j | |  } | | _	 |  j
 |  | S(   sf   
        Load value from pointer, with optional guaranteed alignment:
            name = *ptr
        s5   cannot load from value of type %s (%r): not a pointer(   R    R   R   t   PointerTypeR"   t   strR   t	   LoadInstrR   t   alignR   (   R   t   ptrR   R   t   ld(    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   load  s    	c         C@ s   t  | j t j  s7 t d | j t |  f   n  | j j | j k rk t d | j | j f   n  t j |  j	 | |  } | | _
 |  j |  | S(   se   
        Store value to pointer, with optional guaranteed alignment:
            *ptr = name
        s4   cannot store to value of type %s (%r): not a pointers(   cannot store %s to %s: mismatching types(   R    R   R   R   R"   R   t   pointeeR   t
   StoreInstrR   R   R   (   R   R   R   R   t   st(    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   store  s    	c         C@ sf   t  | j t j  s7 t d | j t |  f   n  t j |  j | | | |  } |  j	 |  | S(   sf   
        Load value from pointer, with optional guaranteed alignment:
            name = *ptr
        s5   cannot load from value of type %s (%r): not a pointer(
   R    R   R   R   R"   R   R   t   LoadAtomicInstrR   R   (   R   R   t   orderingR   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   load_atomic  s    c         C@ s   t  | j t j  s7 t d | j t |  f   n  | j j | j k rk t d | j | j f   n  t j |  j	 | | | |  } |  j
 |  | S(   se   
        Store value to pointer, with optional guaranteed alignment:
            *ptr = name
        s4   cannot store to value of type %s (%r): not a pointers(   cannot store %s to %s: mismatching types(   R    R   R   R   R"   R   R   R   t   StoreAtomicInstrR   R   (   R   R   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   store_atomic  s    c         C@ s,   t  j |  j d | |  } |  j |  | S(   sF   
        Create a switch-case with a single *default* target.
        t   switch(   R   t   SwitchInstrR   Rm   (   R   R   t   defaultt   swt(    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR     s    c         C@ s,   t  j |  j d | g  } |  j |  | S(   s3   
        Unconditional branch to *target*.
        Rb   (   R   t   BranchR   Rm   (   R   t   targetRb   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyRW     s    c         C@ s2   t  j |  j d | | | g  } |  j |  | S(   sV   
        Conditional branch to *truebr* if *cond* is true, else to *falsebr*.
        Rb   (   R   t   ConditionalBranchR   Rm   (   R   R   t   truebrt   falsebrRb   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR[   
  s    c         C@ s)   t  j |  j d |  } |  j |  | S(   s3   
        Indirect branch to target *addr*.
        t
   indirectbr(   R   t   IndirectBranchR   Rm   (   R   t   addrRb   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   branch_indirect  s    c         C@ s   |  j  t j |  j d   S(   s7   
        Return from function without a value.
        s   ret void(   Rm   R   t   RetR   (   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   ret_void  s    c         C@ s   |  j  t j |  j d |   S(   s>   
        Return from function with the given *value*.
        R,   (   Rm   R   R   R   (   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR,   "  s    c         C@ s,   t  j |  j d | g  } |  j |  | S(   s0   
        Resume an in-flight exception.
        t   resume(   R   R   R   Rm   (   R   t
   landingpadRb   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   )  s    c         C@ sA   t  j |  j | | d | d | d | d | } |  j |  | S(   sP   
        Call function *fn* with *args*:
            name = fn(args...)
        R   t   cconvt   tailt   fastmath(   R   t	   CallInstrR   R   (   R   R   t   argsR   R   R   R   t   inst(    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR'   3  s    c         C@ s+   t  j | | | |  } |  j | | |  S(   s#   
        Inline assembler.
        (   R   t	   InlineAsmR'   (   R   t   ftypet   asmt
   constraintR   t   side_effectR   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR   =  s    c         C@ s2   t  j | g   } |  j | d d | g  t |  S(   so   
        Load a register value into an LLVM value.
          Example: v = load_reg(IntType(32), "eax")
        R   s   ={%s}(   R   R$   R   t   False(   R   t   reg_typet   reg_nameR   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   load_regD  s    c         C@ s>   t  j t  j   | g  } |  j | d d | | g t |  S(   s   
        Store an LLVM value inside a register
          Example: store_reg(Constant(IntType(32), 0xAAAAAAAA), IntType(32), "eax")
        R   s   {%s}(   R   R$   t   VoidTypeR   t   True(   R   R   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt	   store_regL  s    c   	   
   C@ s;   t  j |  j | | | | d | d | } |  j |  | S(   NR   R   (   R   t   InvokeInstrR   Rm   (	   R   R   R   t	   normal_tot	   unwind_toR   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   invokeT  s    !	c         C@ s5   t  j |  j | | d | d | } |  j |  | S(   so   
        Compute effective address (getelementptr):
            name = getelementptr ptr, <indices...>
        t   inboundsR   (   R   t   GEPInstrR   R   (   R   R   t   indicesR   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   gep\  s    c         C@ s/   t  j |  j | | d | } |  j |  | S(   s4   
        Returns the value at position idx.
        R   (   R   t   ExtractElementR   R   (   R   t   vectort   idxR   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   extract_elementh  s    c         C@ s2   t  j |  j | | | d | } |  j |  | S(   s   
        Returns vector with vector[idx] replaced by value.
        The result is undefined if the idx is larger or equal the vector length.
        R   (   R   t   InsertElementR   R   (   R   R   R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   insert_elementp  s    	c         C@ s2   t  j |  j | | | d | } |  j |  | S(   s  
        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   t   ShuffleVectorR   R   (   R   t   vector1t   vector2t   maskR   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   shuffle_vectorz  s    	c         C@ sP   t  | t t f  s! | g } n  t j |  j | | d | } |  j |  | S(   s=   
        Extract member number *idx* from aggregate.
        R   (   R    t   tuplet   listR   t   ExtractValueR   R   (   R   t   aggR   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   extract_value  s
    c         C@ sS   t  | t t f  s! | g } n  t j |  j | | | d | } |  j |  | S(   sI   
        Insert *value* into member number *idx* from aggregate.
        R   (   R    R   R   R   t   InsertValueR   R   (   R   R  R   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   insert_value  s
    !c         C@ s,   t  j |  j | d | } |  j |  | S(   NR   (   R   t   PhiInstrR   R   (   R   R:   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   phi  s    c         C@ s#   t  j |  j  } |  j |  | S(   N(   R   t   UnreachableR   Rm   (   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   unreachable  s    c         C@ s5   t  j |  j | | | | d | } |  j |  | S(   NR   (   R   t	   AtomicRMWR   R   (   R   R   R   R9   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt
   atomic_rmw  s    $c      	   C@ sP   | d k r | n | } t j |  j | | | | | d | } |  j |  | S(   s8  
        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   N(   RE   R   t   CmpXchgR   R   (   R   R   t   cmpR9   R   t   failorderingR   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   cmpxchg  s
    c         C@ s,   t  j |  j | | |  } |  j |  | S(   N(   R   t   LandingPadInstrR   R   (   R   R:   R   t   cleanupR   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyR     s    c         C@ s%   |  j  j d  } |  j | | g  S(   s?   
        Optimizer hint: assume *cond* is always true.
        s   llvm.assume(   R#   R&   R'   (   R   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   assume  s    c         C@ s/   t  j |  j | | d | } |  j |  | S(   s   
        Add a memory barrier, preventing certain reorderings of load and/or store accesses with
        respect to other processors and devices.
        R   (   R   t   FenceR   R   (   R   R   t   targetscopeR   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   fence  s    s
   llvm.bswapc         C@ s   d S(   sn   
        Used to byte swap integer values with an even number of bytes (positive multiple of 16 bits)
        N(    (   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   bswap  R   s   llvm.bitreversec         C@ s   d S(   sh   
        Reverse the bitpattern of an integer value; for example 0b10110110 becomes 0b01101101.
        N(    (   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt
   bitreverse  R   s
   llvm.ctpopc         C@ s   d S(   s;   
        Counts the number of bits set in a value.
        N(    (   R   R   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   ctpop  R   s	   llvm.ctlzc         C@ s   d S(   sC   
        Counts the number of leading zeros in a variable.
        N(    (   R   R   R1   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   ctlz  R   s	   llvm.cttzc         C@ s   d S(   sD   
        Counts the number of trailing zeros in a variable.
        N(    (   R   R   R1   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   cttz  R   s   llvm.fmac         C@ s   d S(   s;   
        Perform the fused multiply-add operation.
        N(    (   R   R5   R6   R7   (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   fma  R   N(    (o   t   __name__t
   __module__RE   RG   t   propertyR   RP   RI   R#   RK   RL   RM   RN   RO   t
   contextlibt   contextmanagerRT   RV   RZ   Rc   Rg   R   Rm   R   Rn   Ro   Rp   Rq   Rr   Rs   Rt   Ru   Rv   Rw   Rx   Ry   Rz   R{   R|   R~   R   R   R-   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R;   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   RW   R[   R   R   R,   R   R   R'   R   R   R   R   R   R   R   R   R  R  R  R  R
  R  R   R  R  R0   R  R  R  R2   R  R  R8   R  (    (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyRB      s  							
																								
																
									



			(   t
   __future__R    R   R  R   R   R   R   R   R   t   InstructionR   R-   R/   R0   R2   R8   t	   CastInstrR;   RA   t   objectRB   (    (    (    s2   lib/python2.7/site-packages/llvmlite/ir/builder.pyt   <module>   s&   
				