
    hw                        U d dl Z d dlmZ d dlZd dlZd dlmZmZ d dlZd dl	m
Z
 d dlZ e j        d          ej        j         e j        d          ej        j         e j        d          ej        j         e j        d          ej        j         e j        d	          ej        j         e j        d
          ej        j         e j                    ej        j         e j                    ej        j        iZee j        e j        z  e j        z  ej        f         ed<   i  e j        d          ej        j         e j        d          ej        j         e j        d          ej        j         e j        d          ej        j         e j        d	          ej        j         e j        d
          ej        j          e j                    ej        j!         e j                    ej        j"         e j        d          ej        j#         e j        d          ej        j$         e j        d          ej        j%         e j        d          ej        j&         e j        d          ej        j'         e j        d          ej        j(         e j        d          ej        j)         e j        d          ej        j*        Z+ee j        e j        z  e j        z  ej        f         ed<   dZ,d Z-de j        e j        z  e j        z  ded         dej.        ez  fdZ/de j0        ded         de j        e j        z  e j        z  ez  fdZ1de j0        ded         dej        ej2        z  ej3        z  ez  fdZ4de j0        de j5        ez  fdZ6de j7        j8        ded         dej.        ez  fdZ9de:de;fdZ<de j0        fd Z=de j0        ded         fd!Z>de j0        d"e;fd#Z?de j0        ded         dej@        ez  fd$ZAde j0        ded         fd%ZBde j0        ded         fd&ZCde j0        ded         fd'ZDde j0        ded         fd(ZEde j0        ded         fd)ZFde j0        ded         fd*ZGde j0        ded         fd+ZHde j0        ded         fd,ZIde j0        ded         fd-ZJde j0        ded         fd.ZKde j0        ded         fd/ZLde j0        ded         fd0ZMde j0        ded         fd1ZNe
 G d2 d3                      ZO eOe jP        e>d            eOe jQ        jR        e jQ        jS        ge?d           eOe jQ        jT        geNd           eOe jU        eAd           eOe jV        eBd           eOe jQ        jW        e jQ        jX        geCd           eOe jQ        jY        geDd           eOe jQ        jZ        geEd           eOe j[        eFd           eOe j\        eGd           eOe jQ        j]        geHd           eOe jQ        j^        geId           eOe jQ        j_        geJd           eOe jQ        j`        geKd           eOe jQ        ja        geLd           eOe jQ        jb        geMd          gZcedeO         ed4<   dS )5    N)	Traceback)CallableLiteral)	dataclass                  URCL_X86_REGISTER_MAPPING   	   
      URCL_X64_REGISTER_MAPPINGzCould not parse urcl sourceregisterbits    @   returnc                     |dk    rt           }nt          }|                    |           }|rt          j        |          S t          j        d|  d          S )Nr   URCL register z< could not be mapped to a machine register or memory address)r   r   getx86Operandr   new)r   r   register_mappingx86_registers       5/home/seanl/mnt/public/Repos/urclelf/./compile_x86.pyconvert_urcl_register_to_x86r"   ,   sd    rzz44#''11L v{<((( }thtttuuu    instructionc                    | j         s@t          j        | j        j                                         d| j        | j                  S | j         d         j        }t          |t          j        t          j        t          j        f          sVt          j        | j        j                                         d| j         d         j        | j         d         j                  S |S )Nz5 instruction is missing operands, expected a registerline_numbercolumn_numberr   z5 instruction expected first operand to be a register.)operandsr   r   mnemonicnameupperr'   r(   value
isinstanceurclGeneralRegisterBasePointerStackPointer)r$   r   urcl_destination_registers      r!   get_destination_registerr4   A   s     H} 4 9 ? ? A Axxx  GR  G^  ny  nG  H  H  H  	H + 4Q 7 =/$2FHXZ^Zk1lmm `} 4 9 ? ? A Axxx  GR  G[  \]  G^  Gj  zE  zN  OP  zQ  z_  `  `  `  	`$$r#   c                 h   t          | |          }t          |t                    rE|}|                    | j        j                                         d| j        | j                   |S t          ||          }t          |t                    r|}|                    d| d           |S |j
        S )Nz: instruction does not have valid register as a destinationr&   r    has no x86/x64 equivalent)r4   r.   r   	elaborater*   r+   r,   r'   r(   r"   r-   )r$   r   r3   errorx86_destination_registers        r!   get_x86_destination_registerr:   K   s     8d K K+Y77 );/4::<<xxx  GR  G^  ny  nG  	H  	H  	H;<UW[\\*I66 (^)B^^^___#))r#   c                    | j         s@t          j        | j        j                                         d| j        | j                  S | j         d         j        }t          |t          j                  sVt          j        | j        j                                         d| j         d         j        | j         d         j                  S |S )Nz2 instruction is missing operands, expected a labelr&   r   z1 instruction expected first operand to be a label)r)   r   r   r*   r+   r,   r'   r(   r-   r.   r/   Label)r$   urcl_destinations     r!   get_jump_targetr>   Z   s    E} 4 9 ? ? A Auuu  DO  D[  kv  kD  E  E  E  	E"+A.4&
33 \} 4 9 ? ? A Attt  CN  CW  XY  CZ  Cf  vA  vJ  KL  vM  v[  \  \  \  	\r#   operandc                 T   t          | j        t          j        j                  r0t          j        t          j        | j        j                            S t          | j        t          j        t          j	        t          j
        f          rNt          | j        |          }t          |t                    r"|}|                    d| j         d           |S |S t          | j        t                    rt          j        | j                  S t          | j        t          j        j                  rt          j        | j        j                  S t          | j        t          j        j                  r+t          j        t%          | j        j                            S t          | j        t          j                  r#t          j        | j        j        j                  S t          | j        t          j                  rt          j        d          S t          j        d|  d          S )Nr   r6   r   zURCL operand )r.   r-   r/   urclcstr<   r   r   r+   r0   r1   r2   r"   r   r7   intRelativeAddressoffset	CharacterordcharPortidDefinedImmediater   )r?   r   r   r8   s       r!   urcl_operand_to_x86rK   d   s   '-!344 R{39W]%788999	GMD$8$:JDL]#^	_	_ R/tDDh	** 	EOOVW]VVVWWWL	GM3	'	' R{7=)))	GM4<#?	@	@ 	R{7=/000	GM4<#9	:	: R{3w}122333	GM49	-	- R{7=.1222	GM4#8	9	9 R{1~~}PWPPPQQQr#   r-   bytes_per_intc           	         t          j        t          |           |z            }dg|z  }t          | t	          ||z  t          |           z
            z             D ]+\  }}|||z  z
  dz
  }||z  dz  }||xx         ||z  z  cc<   ,|S )z|Givin a sequence of bytes, what little endian ints do we push
    to the stack to make the stack pointer point to the bytes?r   r   r   )mathceillen	enumeratebytes)r-   rL   	int_countresultibyte	int_indexshift_amounts           r!   bytes_to_stack_intsrY   |   s     	#e**}455IS9_FUU9}+Ds5zz+Q%R%RRSS 2 24m!34q8	M)Q.yT\11Mr#   c                 \    t          j        d| j        j         | j        | j                  S Nz,No x86 translation for for URCL instruction )r   r   r*   r+   r'   r(   )r$   s    r!   emit_no_translation_errorr\      s>    =cH\Haccepe|  J  X  Y  Y  Yr#   c                    t          j        dg           }| j        t          j        j        k    rt          j        |d |           n| j        t          j        j        k    r&|	                    t           j        j        g            nB| j        t          j        j
        k    r&|	                    t           j        j
        g            nJ |S Nr   )r   ASMCoder*   r/   MnemonicHLTsysvadd_syscall_exitNOPadd_instructionRET)r$   r   x86_codes      r!    compile_zero_operand_instructionrh      s    {1b!!Ht}000hd3333		!2	2	2  !126666		!2	2	2  !126666uOr#   entry_pointc                    t          j        |g           }| j        t          j        j        t          j        j        fv r,t          |           }t          |t          j	        j
                  r| j        t          j        j        k    r>|                    t           j        j        t          j
        |j                  g           n| j        t          j        j        k    r>|                    t           j        j        t          j
        |j                  g           nNt          j        d| j        j                                         | j        | j                  S t'          |            |S r[   )r   r_   r*   r/   r`   JMPCALr>   r.   rA   r<   re   r+   CALLr   r   r,   r'   r(   r\   )r$   ri   rg   destination_operands       r!   &compile_unconditional_jump_instructionro      s>   {;++H 14=3DEEE-k::)4<+=>> 	3#t}'888(()9CIFYF^<_<_;`aaaa%):::(():SYGZG_=`=`<abbbb }%wT_ThTmTsTsTuTu%w%w  zE  zQ  S^  Sl  m  m  m%k222Or#   c                    t          j        dg           }| j        t          j        v rt          |           }t          |t                    r2|}|                    | j        j	         d| j
        | j                   |S t          | j        d         |          }t          |t                    r|}|S |                    t           j        j        |j        dg           | j        t          j        j        k    r>|                    t           j        j        t          j        |j	                  g           n| j        t          j        j        k    r>|                    t           j        j        t          j        |j	                  g           ng| j        t          j        j        k    r>|                    t           j        j        t          j        |j	                  g           nt3          |            |S )Nr   z= instruction operand 1 is of incorrect type (expected label).r   )r   r_   r*   r/   $TWO_OPERAND_CONDITION_JUMP_MNEMONICSr>   r.   r   r7   r+   r'   r(   rK   r)   re   r`   CMPr-   BNZJNEr<   BRZJEBRPJGEr\   )r$   r   rg   rn   r8   x86_source_operands         r!   $compile_two_operand_jump_instructionrz      s   {1b!!HtHHH-k::)955 	'EOO{38www  zE  zQ  S^  Sl  m  m  mL01Ea1H$OO()44 	&EL  !14F4La3PQQQ4=#444$$S\%5	BUBZ8[8[7\]]]]!T]%666$$S\_syATAY7Z7Z6[\\\\!T]%666$$S\%5	BUBZ8[8[7\]]]]%k222Or#   c                    t          j        dg           }| j        t          j        v rt          |           }t          |t          j        j                  s0t          j
        | j        j         d| d| j        | j                  S t          | j        d         |          }t          | j        d         |          }t          |t                    r|S t          |t                    r|S |                    t           j        j        |j        |j        g           | j        t          j        j        k    r?|                    t           j        j        t          j        |j                  g           np| j        t          j        j        k    r?|                    t           j        j        t          j        |j                  g           n| j        t          j        j        k    r>|                    t           j        j        t          j        |j                  g           n| j        t          j        j        k    r>|                    t           j        j        t          j        |j                  g           ng| j        t          j        j        k    r>|                    t           j        j        t          j        |j                  g           nt=          |            |S )Nr   z instruction operand 1 'z(' is of incorrect type (expected label).r   r   )r   r_   r*   r/   &THREE_OPERAND_CONDITION_JUMP_MNEMONICSr>   r.   rA   r<   r   r   r+   r'   r(   rK   r)   re   r`   rr   r-   BLEJBEBGErx   BRErv   BNErt   BRLJLr\   )r$   r   rg   rn   x86_source_operand_1x86_source_operand_2s         r!   &compile_three_operand_jump_instructionr      s   {1b!!HtJJJ-k::-t|/ABB 	J=K$8$=  "U  "UWj  "U  "U  "U  Wb  Wn  p{  pI  J  J  J2;3G3JDQQ2;3G3JDQQ*I66 	(''*I66 	(''  !14H4NPdPj3klll4=#444$$S\%5	BUBZ8[8[7\]]]]!T]%666$$S\%5	BUBZ8[8[7\]]]]!T]%666$$S\_syATAY7Z7Z6[\\\\!T]%666$$S\%5	BUBZ8[8[7\]]]]!T]%666$$S\_syATAY7Z7Z6[\\\\%k222Or#   c                    | j         t          j        j        t          j        j        fv rt          | |          }t          |t                    r|S t          | j	        d         |          }t          | j	        d         |          }t          |t                    r|S t          |t                    r|S t          j        t          j        |          |||| j         t          j        j        k              S )Nr   r   )	do_modulo)r*   r/   r`   DIVMODr:   r.   r   rK   r)   r   generate_division_coder   )r$   r   destinationsource_1source_2s        r!   compile_division_instructionr      s     14=3DEEE2;EEk9-- 	&{';A'>EE&{';A'>EEh	** 	Oh	** 	O%ck+&>&>(TXdodxz~  {H  {L  eL  M  M  M  Mr#   c                 b	   t          j        |          }t          j        dg           }| j        t          j        j        k    rjt          | j        d         j	        t          j
                  r%| j        d         j	        }| j        d         j	        }nWt          | j        d         j	        t                    r0t          j
                            | j        d         j	                  }nd }|/t          j        d| j        d          d| j        | j                  S |t          j
        j        k    rt          | j        d         j	        t                    r4t%          | j        d         j	                                      d          }nt          | j        d         j	        t(                    r&| j        d         j	                            d          }nt          | j        d         j	        t          j                  r+| j        d         j	        j                            d          }nlt          | j        d         j	        t          j                  r| j        d         j	        }n/t          j        d| j        d          d| j        | j                  S |                    |           t          |t          j                  ru|dz  }d}t3          ||          }	t          |	t                    r|	}
|
                    d	| d
           |
S |                    t           j        j        |	j	        g           nlt;          j        t?          |          dz            }t?          |          }tA          |d          D ](}|                    t           j        j        |g           )tC          j"        ||j#        |tB          j$        j%        |           |                    t           j        j&        |j#        |dz  g           |'                    |           n|                    t           j        j        tQ          | j        d         |          j	        g           |                    t           j        j)        t          j*        d|j+        ,                                 d          g           |S )Nr   OUT instruction operand 1 '' is not a valid portr   utf-8OUT instruction operand 2 '' cannot be output onto a port.r   Destination register  for OUT instruction is invalidr
   
urcl_port__out)-r   get_registersr_   r*   r/   r`   OUTr.   r)   r-   rH   rB   
from_valuer   r   r'   r(   TEXTchrencodestrrE   rG   r0   *add_instructions_to_save_general_registersr"   r7   re   PUSHrN   rO   rP   rY   rb   add_syscall_fwritespFileSTDOUTADD-add_instructions_to_restore_general_registersrK   rm   r<   r+   lower)r$   r   	registersrg   port	port_nameoutput_stringstring_length_bytesrS   r   r8   uints               r!   compile_out_instructionr      sG   !$''I{1b!!Ht}000k*1-3TY?? 	'*0D#,Q/5II,Q/5s;; 	9''(<Q(?(EFFDDD<=!m{?STU?V!m!m!moz  pG  IT  Ib  c  c  c49>!! +.q17== 
q #K$8$;$A B B I I' R RK0393?? q + 4Q 7 = D DW M MK0394>JJ q + 4Q 7 = B I I' R RK0394;OPP q + 4Q 7 = }%{;CWXYCZ%{%{%{  ~I  ~U  Wb  Wp  q  q  q??	JJJ-)=>> H&*ai#	:=$OOk955 !'EOO$jM$j$j$jkkk L(():[=N<OPPPP Ic-&8&8A&>??	&)-&8&8#/qAA H HD,,S\->GGGG#Hil<OQUQZQacghhh$$S\%5	iRSm7TUUUBB9MMMM$$S\%69L[MabcMdfj9k9k9q8rsss$$S\%6CgPTPYP_P_PaPaCgCgCg9h9h8ijjjOr#   c                    t          j        |          }t          j        dg           }| j        t          j        j        k    rt          | j        d         j	        t          j
                  r| j        d         j	        }nWt          | j        d         j	        t                    r0t          j
                            | j        d         j	                  }nd }|/t          j        d| j        d          d| j        | j                  S t          | j        d         j	        t                    r4t#          | j        d         j	                                      d          }nt          | j        d         j	        t&                    r&| j        d         j	                            d          }nt          | j        d         j	        t          j                  r+| j        d         j	        j                            d          }nlt          | j        d         j	        t          j                  r| j        d         j	        }n/t          j        d| j        d          d| j        | j                  S |                    |           t          |t          j                  rrd}d}t1          ||          }t          |t                    r|}	|	                    d	| d
           |	S |                    t           j        j        |j	        g           nlt9          j        t=          |          dz            }t=          |          }t?          |d          D ](}
|                    t           j        j        |
g           )tA          j!        ||j"        |t@          j#        j$        |           |                    t           j        j%        |j"        |dz  g           |&                    |           |S )Nr   r   r   r   r   r   r   r
   r   r   )'r   r   r_   r*   r/   r`   r   r.   r)   r-   rH   rB   r   r   r   r'   r(   r   r   r   rE   rG   r0   r   r"   r7   re   r   rN   rO   rP   rY   rb   r   r   r   r   r   r   )r$   r   r   rg   r   r   r   uint32_countr   r8   u32s              r!   compile_in_instructionr   (  s   !$''I{1b!!Ht}000k*1-3TY?? 	'*0DD,Q/5s;; 	9''(<Q(?(EFFDDD<=!m{?STU?V!m!m!moz  pG  IT  Ib  c  c  c k*1-3S99 
	m 4Q 7 =>>EEgNNMM,Q/5s;; 	m'039@@IIMM,Q/5t~FF 	m'039>EEgNNMM,Q/5t7KLL 	m'039MM=!w{?STU?V!w!w!w  zE  zQ  S^  Sl  m  m  m;;IFFFmT%9:: 	C"#L6}dKKK+y11 # f f f fggg$$S\%69J8KLLLL9S%7%7!%;<<L"%m"4"4*=!<< C C(():SEBBBB),8KTYM]_cddd  !1IL,QRBR3STTT>>yIIIOr#   c                    t          j        dg           }| j        t          j        v rt          | |          }t          |t                    r|S | j        t          | j                  dz
           }t          ||          }t          |t                    r(|}|                    d| |j        |j                   |S |                    ||j                   | j        t          j        j        t          j        j        fv rn| j        t          j        j        k    r(|                    t           j        j        |g           n| j        t          j        j        k    r(|                    t           j        j        |g           nb| j        t          j        j        k    r(|                    t           j        j        |g           n | j        t          j        j        k    r'|                    t           j        j        |g           n| j        t          j        j        k    rN|                    t           j        j        |g           |                    t           j        j        |dg           nw| j        t          j        j        k    rN|                    t           j        j        |g           |                    t           j        j        |dg           nt9          |            |S )Nr   r   zInvalid source operand l    i)r   r_   r*   r/    TWO_OPERAND_ARITHMETIC_MNEMONICSr:   r.   r   r)   rP   rK   r7   r'   r(   add_mover-   r`   MOVIMMINCre   DECNEGNOTLSHROLANDRSHr\   )r$   r   rg   r   urcl_source_operandry   r8   s          r!   *compile_two_operand_arithmetic_instructionr   Z  s   {1b!!HtDDD2;EEk9-- 	)23{7K3L3Lq3PQ01DdKK()44 	&EOOK6IKKM`Ml  oB  oP  Q  Q  QL+'9'?@@@DM$5t}7H#III!T]%666$$S\%5}EEEE!T]%666$$S\%5}EEEE!T]%666$$S\%5}EEEE!T]%666$$S\%5}EEEE!T]%666$$S\%5}EEE$$S\%5EU7VWWWW!T]%666$$S\%5}EEE$$S\%5Y7OPPPP%k222Or#   c                 2   t          j        dg           }| j        t          j        v rmt          | |          }t          |t                    r|S t          | j	        d         |          }t          | j	        d         |          }t          |t                    r|S t          |t                    r|S | j	        d         | j	        d         k    r|
                    ||j                   t          j        j        t           j        j        t          j        j        t           j        j        t          j        j        t           j        j        i}|                    | j                  }|r|                    |||j        g           nt%          |            |S )Nr   r   r   )r   r_   r*   r/   "THREE_OPERAND_ARITHMETIC_MNEMONICSr:   r.   r   rK   r)   r   r-   r`   r   SUBXORr   re   r\   )r$   r   rg   r   r   r   arithmetic_mappingx86_mnemonics           r!   ,compile_three_operand_arithmetic_instructionr   ~  sc   {1b!!HtFFF2;EEk9-- 	&{';A'>EE&{';A'>EEh	** 	Oh	** 	O"k&:1&===k8>:::Ms|/Ms|/Ms|/A

 *--k.BCC 	3$$\K3PQQQQ%k222Or#   c                    t          j        dg           }| j        t          j        j        fv r]t          | j        d         |          }t          |t                    r|S |
                    t           j        j        |j        g           |S r^   )r   r_   r*   r/   r`   PSHrK   r)   r.   r   re   r   r-   )r$   r   rg   ry   s       r!   compile_push_instructionr     s    {1b!!H 122201Ea1H$OO()44 	&%%  !25G5M4NOOOOr#   c                     t          j        dg           }| j        t          j        j        fv rMt          | |          }t          |t                    r|S |	                    t           j        j        |g           |S r^   )
r   r_   r*   r/   r`   POPr:   r.   r   re   )r$   r   rg   r    s       r!   compile_pop_instructionr     sr    {1b!!H 12223KFFlI.. 	   !1L>BBBOr#   c                    t          j        dg           }| j        t          j        j        t          j        j        fv rt          | |          }t          |t                    r|}|
                    d           |S t          | j        d         |          }t          |t                    r(|}|
                    d| j        d          d           |S |j         t          | j                  dk    r_| j        d         j        }t          |t                    s7t          j        d| j        d         j        | j        d         j        	          S nd}t          |t                    r|S t          j        |j        |gt           j        j                  }t          |t                    r|}|
                    d
           |S |                    t           j        j        ||g           |S )Nr   z(LLOD instruction has invalid destinationr   zLLOD base address 'z' is not validr	   r   zLLOD index must be an integerr&   z/LLOD target address cannot be translated to x86)r   r_   r*   r/   r`   LODLLODr:   r.   r   r7   rK   r)   r-   rP   rB   r   r'   r(   sum_into_effective_addressPointerSizeDWORDre   r   )r$   r   rg   x86_destinationr8   sourceindexmemorys           r!   compile_list_load_instructionr     s   {1b!!H 14=3EFFF6{DIIoy11 	#EOOFGGGL$[%9!%<dCCfi(( 	EOOY+2Fq2IYYYZZZL {#$$))(+1EeS)) l }%DR]RfghRiRu  FQ  FZ  [\  F]  Fk  l  l  l  ll Efi(( 	M/u0EsG\]]fi(( 	EOOMNNNL  !1OV3LMMMOr#   c                    t          j        dg           }| j        t          j        j        fv rt          | j        d         |          }t          | j        d         |          }t          | j        d         |          }t          |t                    r'|}|
                    d| j        d                     |S t          |t                    r'|}|
                    d| j        d                     |S t          |t                    r'|}|
                    d| j        d                     |S t          |j        t          t           j        f          s"t          j        d| j        d                    S |                    d|j                  }|j        }|                    t           j        j        ||g           |S )	Nr   r   r   z,LSTR instruction got invalid source operand z1LSTR instruction got invalid destination operand z3LSTR index operand must be an int or register, not r
   scalerD   )r   r_   r*   r/   r`   LSTRrK   r)   r.   r   r7   r-   rB   Registerr   	as_memoryre   r   )r$   r   rg   destr   r   r8   s          r!   compile_list_store_instructionr     s   {1b!!H 2333";#7#:DAA$[%9!%<dCC#K$8$;TBBfi(( 	EOOd;K_`aKbddeeeLdI&& 	EOOiP[PdefPgiijjjLeY'' 	EOOkR]RfghRikklllL%+S\':;; 	r=!pWbWklmWn!p!pqqq!!%+!>>z  !1D&>BBBOr#   c                 r   t          j        dg           }| j        t          j        j        fv rt          | |          }t          |t                    r|S t          | j
        d         |          }t          |t                    r|S |                    dd          }t          |t           j                  sJ t          j        t          j        d          |gt           j        j                  }t          |t                    rJ |                    t           j        j        ||j        g           |S )Nr   r   r
   r   urcl_m0)r   r_   r*   r/   r`   r   r:   r.   r   rK   r)   r   r   r   r<   r   r   re   r   r-   )r$   r   rg   r    r   r   fixmes          r!   compile_load_instructionr     s   {1b!!H 12223KFFlI.. 	 $[%9!%<dCCfi(( 	M!!!!44,55555.	)0D0Dl/SUXUdUjkkeY/////  !1E6<3HIIIOr#   c                 H   t          j        dg           }| j        t          j        j        fv rt          | j        d         |          }t          | j        d         |          }t          |t                    r'|}|
                    d| j        d                     |S t          |t                    r'|}|
                    d| j        d                     |S |                    dd          }|j        }|                    t           j        j        ||g           |S )Nr   r   z+STR instruction got invalid source operand z0STR instruction got invalid destination operand r
   r   )r   r_   r*   r/   r`   STRrK   r)   r.   r   r7   r   r-   re   r   )r$   r   rg   r   r   r8   s         r!   compile_store_instructionr     s   {1b!!H 1222";#7#:DAA$[%9!%<dCCfi(( 	EOOc+J^_`JaccdddLdI&& 	EOOh{OcdeOfhhiiiL~~Aa~00  !1D&>BBBOr#   c                 l   t          j        dg           }|dk    r4t           j        j        }t           j        j        }t           j        j        }n3t           j        j        }t           j        j        }t           j        j        }| j        t          j	        j
        fv rt          | |          }t          |t                    r|S t          | j        d         |          }t          | j        d         |          }t          |t                    r|S t          |t                    r|S ||k    r&|                    t           j	        j        |g           ||k    r&|                    t           j	        j        |g           |                    ||j                   |                    t           j	        j        |j        g           |                    ||           ||k    r&|                    t           j	        j        |g           ||k    r&|                    t           j	        j        |g           |S )Nr   r   r   r   )r   r_   r   RAXRDXEAXEDXr*   r/   r`   MLTr:   r.   r   rK   r)   re   r   r   r-   MULr   )	r$   r   rg   multiplicand_1_registermultiplicand_2_registerresult_registerr   r   r   s	            r!   compile_multiply_instructionr     s   {1b!!Hrzz"%,"2"%,"2,*"%,"2"%,"2,* 12222;EEk9-- 	&{';A'>EE&{';A'>EEh	** 	Oh	** 	O111$$S\%69P8QRRR111$$S\%69P8QRRR18>BBB  !1HN3CDDD+777111$$S\%58O7PQQQ111$$S\%58O7PQQQOr#   c                   ~    e Zd ZU eej                 ed<   eej        e	d         ge
j        ez  f         ed<   eed<   dS )InstructionFamily	mnemonicsr   compileoperand_countN)__name__
__module____qualname__listr/   r`   __annotations__r   InstructionCSTNoder   r   r_   r   rB    r#   r!   r   r   =  s[         DM""""t.@#+PYBYYZZZZr#   r   TRANSLATIONS)er/   r8   r   r   rN   typingr   r   rb   dataclassesr   x86.registerr0   r   r   EBXECXr   EDIESIr1   EBPr2   ESPr   dictr   r   RBXRCXr   RDIRSIRBPRSPR8R9R10R11R12R13R14R15r   PARSING_ERROR_MESSAGENO_ERROR_EXIT_CODEr   r"   r   r4   EffectiveAddress	Immediater:   r<   r>   rA   OperandCSTNoderK   rR   rB   rY   r\   rh   ro   r_   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ZERO_OPERAND_MNEMONICSr`   rk   rl   r   rq   r|   r   r   r   INr   r   r   r   r   r   r   r   r  r   r  r#   r!   <module>r"     sQ
          



  $ $ $ $ $ $ $ $  ! ! ! ! ! !     DS\-DS\-DS\-DS\-DS\-DS\-D(D)	n 4 4t7G G$J[ []`]i ij 	 	 	nDS\-nDS\-n DS\-n DS\-	n
 DS\-n DS\-n D(n D)n DS\_n DS\_n Dcl.n Dcl.n DS\-n DS\-n Dcl.n  Dcl.!n 4 4t7G G$J[ []`]i ij   & 6  v4+?$BR+RUYUf+f vnuv|n} v  CF  CN  QZ  CZ v v v v*%$*A %QW %]a]qtx  uE  ^E  HL  HY  ^Y  \e  ^e % % % %*d.E *WU[_ *adamps  qE  bE  HK  HU  bU  Xa  ba * * * *!8 TZ)=S    R!< RGFO RX[XcfoXo R R R R0
u 
S 
 
 
 
Y4+B Y Y Y Y$2I QXY_Q`    8O ^a    "d6M U\]cUd ilit  xA  jA    28O W^_eWf    <Md.E MWU[_ M M M M6)@ 6PV 6 6 6 6p0(? 0wv 0 0 0 0d"D<S "[bci[j " " " "Hd>U ]dek]l    8	$*A 	QW 	 	 	 		)@ 	PV 	 	 	 	!t/F !gV\o ! ! ! !F0G wW]    8$*A QW    &4+B 'RX/    *$d.E $WU[_ $ $ $ $L         d13SUVWWt}($-*;<>dfghht}()+GKKd?AeghiidACiklmmt}($-*;<>Z\]^^t}()+BAFFt}'(*@!DDd;=gijkkd=?kmnoot}()+CQGGt}()+BAFFt})*,I1MMt})*,JANNt}()+CQGGt}()+DaHH!)d$%     r#   