
    /gN              	          d dl mZ d dlZd dlZd dlZd dlmZmZ d dlm	Z	m
Z
mZmZmZmZmZmZ d dlmZmZmZmZmZmZmZ d dlmZmZ dZdZdZ ed	
           G d d                      Z ed	
           G d d                      Z e ez  e	z  Z! G d dej"                  Z#dede!fdZ$e G d d                      Z%de	ez  dedz  fdZ&de	ez  dz  ded         dz  dedz  fdZ'defdZ(de	ez  dz  dedz  fdZ)de	dz  d e	ez  dz  dedz  de
dz  fd!Z*defd"Z+defd#Z,ded$eded%         fd&Z-dee	z  dz  d'e
dz  dedz  fd(Z.de	ez  dz  d'e
dz  d)edz  fd*Z/d+edz  d,edz  d-e0fd.Z1d/ed0e%d1e0dee#z  fd2Z2e G d3 d4                      Z3d5ede4ez  fd6Z5de6e%         ez  fd7Z7d/ed1e0deez  fd8Z8dS )9    )	dataclassN)LiteralSelf)RegisterModRegRMOpcodeX86InstructionAddressingModeInstructionPrefixesScaleIndexByte	ThreeBits)MnemonicEffectiveAddressASMInstructionProgramLabelOperand	Immediate)	TracebackMessage      T)frozenc                   4    e Zd ZU ed         ed<   dZeed<   dS )ImmediateType)r      r   sizeFis_relativeN)__name__
__module____qualname__r   __annotations__r   bool     H/media/seanl/Data/Files/Programming/Python/URCL/urclelf/./x86/codegen.pyr   r      s3         
'
Kr%   r   c                   0    e Zd ZU dZed         dz  ed<   dS )RegisterSizeN)          r   )r   r    r!   r   r   r"   r$   r%   r&   r(   r(      s,         &*D')
t
#*****r%   r(   c                       e Zd Z ej                    Z ej                    Z ej                    Z ej                    Z ej                    Z	 ej                    Z
 ej                    Z ej                    ZdS )CodeGenErrorN)r   r    r!   enumautoUNKNOWNWRONG_MNEMONICINCORRECT_OPERAND_COUNTBAD_RM_TYPEBAD_DISPLACEMENTBAD_IMMEDIATEINCORRECT_REGISTER_SIZEINCORRECT_OPERAND_TYPEr$   r%   r&   r-   r-      s|        dikkGTY[[N'dikk$)++K ty{{DIKKM'dikk&TY[[r%   r-   operandoperand_typec                     t          |t                    r|                                 |j        k    S t          |t                    rt          | j        t                    sdS dS | j        |k    S )NFT)
isinstancer(   get_register_sizer   r   valueint)r8   r9   s     r&   match_operandr?   #   sk    ,-- -((**l.???	L-	0	0 -'--- 	5t},,r%   c                   |    e Zd ZU eed<   eed<   edz  ed<   ee         ed<   e	de
fd            Zd Zd	ed
efdZdS )InstructionEncodingmnemonicopcodeNopcode_extentionoperandsencodingc                 $   t          dd          }d| vrt          j        d|  d          S |                     dd          \  }}d|v rt|                    dd          \  }}t	          |          }|dk    sD|dk    s>|d	k    s8|d
k    s2|dk    s,|dk    s&|dk    s |dk    st          j        d| d|           S nd }t          j        t                              |                    }|                                }|s7t          j        dt          |                                           d          S |^}}t          |          }g }	|D ]-}
t          j        |
          }|r|	                    |           /|
dk    r9|	                    t          |                                rdnd                     n|
dk    r#|	                    t          d                     |
dk    r#|	                    t          d                     |
dk    r#|	                    t          d                     |
dk    r%|	                    t          dd                     |
dk    r%|	                    t          d	d                     ?|
dk    r%|	                    t          dd                     j|
dk    r%|	                    t          dd                     |
dk    r%|	                    t          d	d                     |
d k    r%|	                    t          dd                     |
d!k    rt          j        d"t          |                                           d#|
 d$          c S t!          ||||	          S )%NFr   :z
Encoding 'z' is missing ':'r   )maxsplit.r      r            zOpcode 'z' has invalid extention zEncoding of opcode z is missingrr+   r)   r8r16r*   r32i8i16i32rel8Trel16rel32eszUnknown operand for opcode z: '')r   r   newsplitr>   
from_bytesbytesfromhexhexr   r   	from_nameappendr(   get_register_size_bitr   rA   )rF   rC   
opcode_strrestopcode_extention_strrD   mnemonic_strrE   rB   operand_formatsr8   regs               r&   from_strzInstructionEncoding.from_str5   s,    q!!h=!Hh!H!H!HIII#>>#>::
D*/9/?/?a/?/P/P,J,"#788$))-=-B-BFVZ[F[F[_ost_t_t  yI  MN  yN  yN  Rb  fg  Rg  Rg  k{  @  k@  k@  DT  XY  DY  DY }%f
%f%fTd%f%fggg#"5==#<#<==zz|| 	Y=!WuV}}7H7H7J7J!W!W!WXXX"&xL))-/ 	g 	gG$W--C g&&s++++C&&|&:V:V:X:X4_BB^_'`'`aaaaD&&|A7777E!!&&|B'7'78888E!!&&|B'7'78888D&&}Q'>'>????E!!&&}Q'>'>????E!!&&}Q'>'>????F""&&}Q'='=>>>>G##&&}Q'='=>>>>G##&&}Q'='=>>>>D }%e5==CTCTCVCV%e%e[b%e%e%efffff"8V5EWWWr%   c                 L    | j         D ]}t          |t                    r|c S d S N)rE   r;   r   )selfoperand_formats     r&   get_immediatez!InstructionEncoding.get_immediatei   s@    "m 	& 	&N.-88 &%%%%&	& 	&r%   instructiondirection_bitc                 T   g }t          | j                  D ]\  }}t          |t                    r|j        |         }t          |j        t
          t          f          st          j        c S |	                                |j
        k    rt          j        c S |                    |j                   |sd S t          |          dk    rd |d         }}d |d         fS t          |          dk    r$|r|d         |d         }}n|d         |d         }}nt          j        S t          |t                    rt          j        S t          |t                    r)|j        r!|j        j        j
        dk    rt          j        S n&|j        j
        |j        j
        k    rt          j        S ||fS )Nr   r   r   r+   )	enumeraterE   r;   r(   r=   r   r   r-   r7   r<   r   r6   rb   lenr2   base)	rm   rp   rq   rE   indexrn   r8   ri   rms	            r&   get_regrm_operandsz&InstructionEncoding.get_regrm_operandso   s   68%.t}%=%= 	/ 	/!E>.,77 /%.u5!'-(<L1MNN ?'>>>>,,...2EEE'????... 	4x==AXa[C(1+&&]]a 5#A;R#A;R  77c+,, 	766b*++ 	<w @7=%++'??y~..#;;Bwr%   )r   r    r!   r   r"   r   r   listOperandTypestaticmethodstrrj   ro   r   r#   rx   r$   r%   r&   rA   rA   .   s         NNN$&&&&;1X3 1X 1X 1X \1Xf& & &+n +T + + + + + +r%   rA   
rm_operandreturnc                 ~   t          | t                    rt          j        S t          | j        t
                    sd S | j        dk    s$| j        )| j        "| j        dk    r| j        dk     rt          j        S | j        dk    r| j        dk     rt          j	        S | j        dk    r| j        dk     rt          j
        S d S )Nr                 )r;   r   r
   DIRECTdisplacementr>   ru   rv   INDIRECTINDIRECT_WITH_BYTE_DISPLACEMENT#INDIRECT_WITH_FOUR_BYTE_DISPACEMENT)r}   s    r&   calculate_modr      s    *h'' %$$j-s33 	t		 A	%	%*/*AjFVF^cmcz  J  dJ  dJ  OY  Of  is  Os  Os&&		 E	)	)j.E.L.L==		 K	/	/J4Kj4X4XAAtr%   rD   )r   r   r   rK   r   rL   rM   rN   c                 ~    ||S t          | t                    r| j        j        S t          | t                    rd S d S rl   )r;   r   r=   coder   )r8   rD   s     r&   calculate_regr      sH    #	GX	&	& }!!	G-	.	. ttr%   effective_addressc                 h    | j         dS | j        r	| j        dS | j        r| j        j        j        S d S )Nr   rL   )rv   r   ru   r=   r   )r   s    r&   get_rm_coder      sH    *q		' ->-C-Kq		  %+00tr%   c                     t          | t                    rt          |           S t          | t                    r| j        j        S d S rl   )r;   r   r   r   r=   r   )r8   s    r&   calculate_rmr      sE    '+,, 7###	GX	&	& }!!tr%   registerregister_or_memoryc                     |d S t          |          }t          | |          }t          |          }|||d S t          |||          S rl   )r   r   r   r   )r   r   rD   modri   rw   s         r&   calculate_modregrmr      s]    !t
*
+
+C
"2
3
3C	(	)	)B
{ckRZtCb!!!r%   c                     t          t          j        | j                            }|dk    s|dk    s|dk    s|dk    r|S d S )Nr   r   r   rK   )roundmathlog2scale)r   r   s     r&   calculate_sib_scaler      sJ    $)-34455EzzUaZZ5A::! 2<r%   c                     | j         t          j        k    r	| j        dS | j        d S | j        j        j        }|dk    rd S |S Nr   )ru   r   ESPrv   r=   r   )r   rv   s     r&   calculate_sib_indexr      sO    --2C2I2Qq&t#).EzztLr%   r   )	r   r   r   rK   r   rL   rM   rN   Nc                 6    | j         dS | j         j        j        S )NrL   )ru   r=   r   )r   r   s     r&   calculate_sib_baser      s    %q!',,r%   
mod_reg_rmc                    |d S |j         t          j        k    r|j        dk    sd S t	          | t
                    sd S t          |           }t          |           }t          | |j                   }|||d S t          |||          S r   )
r   r
   r   rw   r;   r   r   r   r   r   )r   r   r   rv   ru   s        r&   calculate_sibr      s    tNn333
8J8Jt')9:: t 122E 122E/@@D}t%---r%   sibc                    t          | t                    st                      S | j        }|r|j        }|j        }|t          j        k    rt          j	        d|          S |t          j
        k    rt          j	        d|          S |t          j        k    r|dk    rt          j	        d|          S t                      S |rJ t                      S )N<b<irL   )r;   r   r^   r   r   rw   r
   r   structpackr   r   )r   r   r   r   r   rw   s         r&   calculate_displacementr      s    ')9:: ww$1L 
n].@@@;t\222NFFF;t\222N+++a;t\22277NOO777Nr%   immediate_valueimmediate_typeimmediate_addressc                 
   |t                      S t          | t                    sd S ||j        z   }|j        r| |z
  n| }|j        dk    rF|dk     s|dk    r|j        r|dk     s|dk    r	|j        rd S t          j        d|dz   dz  dz
            S |j        dk    r#|dk     s|dk    rd S t          j        d	|          S |d
k     s|dk    r|j        r|d
k     s|dk    r	|j        rd S t          j        d|dz   dz  dz
            S )Nr   r      r   r   r   i i   z<hr   l        r   r   )r^   r;   r>   r   r   r   r   )r   r   r   instruction_end_addressimmediate_value_relatives        r&   encode_immediater     s   wwos++ t/.2EELZLf{1HHHl{a%--1IV1S1S]k]w1S  W  Z_  _  _  c{  C  cC  cC  IW  Ic  cC4{4#;c#AS"HC!OPPP			!	!$w..2Jf2T2T4{4!9:::%337OS_7_7_iw  jD7_  Kc  fq  Kq  Kq  uM  Q[  u[  u[  ao  a{  u[4{4#;e#Cu"LPU!UVVVr%   rp   rF   instruction_addressc                 t   | j         |j         k    rt          j        S t          | j                  t          |j                  k    rt          j        S t          d ddd           }|                    | |j        	                                          }t          |t                    r|S |d\  }}d }n|\  }}t          |||j                  }t          ||          }t          |||          }	|t          t          |                    z  }|t          t          |j                            z  }|r|t          t          |                    z  }|r|t          t          |                    z  }|t          |	          z  }t!          |                                 |                                |          }
|
t          j        S t'          t          |j                            D ]6}t)          | j        |         |j        |                   st          j        c S 7t-          ||j        |||	|
          S )NF)NN)rB   r-   r1   rt   rE   r2   r   rx   rC   get_direction_bitr;   r   rD   r   r   r^   r   ro   r5   ranger?   r7   r	   )rp   rF   r   prefixesregrm_operandsr   r   r   r   r   	immediaterv   s               r&   !encode_instruction_using_encodingr   +  s(   x000**
;  C(9$:$:::33"4t<<H00ho>_>_>a>abbN.,// a		'1$$

'5$$'2DhF_``

*J
7
7C)*<j#NNL3uX///3uX_55666 6s5#4#4555
 /s5::.3|,,, !:!:!<!<h>T>T>V>VXkllI))s8,--.. 7 7[1%8(:KE:RSS 	76666	7 (HOZlT]^^^r%   c                       e Zd ZU eed<   eeez           ed<   ee         ed<   ee         ed<   ee	ef         ed<   e
dedefd            Zd	 Zdeez  fd
ZdS )CodeGenIterationorigininstructionsinstruction_addressesinstruction_lengthslabelsprogramr~   c           	         g }i }|j         D ]H}|                    |           t          |t                    r|                    |j        di           It          |j        |dgt          |          z  dgt          |          z  |          S )Nr   )	r   rb   r;   r   updatenamer   entry_pointrt   )clsr   r   r   rp   s        r&   from_assemblyzCodeGenIteration.from_assemblyZ  s     68!#"< 	5 	5K,,,+u-- 5{/3444 3\A3\IZIZCZ]^\_befrbsbs\su{|||r%   c                    | j         }t                      }| j        D ]/}t          |t                    rt          |j        g           }|j        D ]}t          |j        t                    rP| j	        
                    |j        j                  }|d}|j                            t          |                     l|j                            |           t          ||          }t          |t                    s|                    d| d           |c S |t          |          z  }|t#          t          |                    z  }1|S Nr   zUnable to encode instruction 'rZ   )r   r^   r   r;   r   r   rB   rE   r=   r   getr   rb   r   encoder	   	elaboratert   )rm   current_addressmachine_code_bytesrp    instruction_with_labels_resolvedr8   addressmachine_instructions           r&   as_byteszCodeGenIteration.as_bytesf  s\   +"WW, 	? 	?K+u-- /=k>RTV/W/W,&/ N NgmU33 N"koogm.@AAG"#4=DDWWEUEUVVVV4=DDWMMMM"()I?"["[1>BB +#--.]{.].].]^^^****%(;"<"<<s5)<#=#=>>>OO!!r%   c                    | j         }g }g }i }| j        }| j         D ]}t          |t                    rG|                    |j        |i           |                    |           |                    d           _t          |j        g           }|j	        D ]}t          |j
        t                    rP| j                            |j
        j                  }	|	d}	|j	                            t          |	                     l|j	                            |           t          ||          }
t          |
t                    s|
                    d| d           |
c S t#          |
          }|                    |           |t%          |          z  }|                    t%          |                     t'          | j        ||||          S r   )r   r   r;   r   r   r   rb   r   rB   rE   r=   r   r   r   r   r	   r   r^   rt   r   )rm   next_instructionsnext_instruction_addressesnext_instruction_sizesnext_labelsr   rp   r   r8   r   r   r   s               r&   nextzCodeGenIteration.next  s   :>:K02",.&(+, 	C 	CK+u-- ""K$4o#FGGG*11/BBB&--a000/=k>RTV/W/W,&/ N NgmU33 N"koogm.@AAG"#4=DDWWEUEUVVVV4=DDWMMMM"()I?"["[1>BB +#--.]{.].].]^^^****!&':!;!;&--o>>>s#5666O"))#.@*A*ABBBB->@Z\rt  A  A  	Ar%   N)r   r    r!   r>   r"   ry   r   r   dictr|   classmethodr   r   r   r   r   r   r$   r%   r&   r   r   R  s         KKK~-....9$$$c"""cN	}G 	} 	} 	} 	} [	}" " "2 AdY&  A  A  A  A  A  Ar%   r   r   c                    t                               |           }d }d}||k    r|r|}|                                }t          |t                    r|}|                    d           |S |dk    rt	          j        d          S t          |t                    r|S |dz  }||k    |J |                                }t          |t                    rJ |S )Nr   zCode does not compiler)   zCodegen took too long, aborted.r   )	r   r   r   r;   r   r   r[   r^   r   )r   last_iterationcurrent_iterationiteration_counterrorr   s         r&   assembler     s    %33G<<NO
~
-
- 	/.N*//11'33 	%EOO3444LQ=!BCCC'// 	%$$1 ~
-
- ((( ))++H(I..//.Or%   c                     t          dd          5 } |                                                                 }g }|D ]q}t                              |          }t          |t                    r+|}|                    d| d           |c cd d d            S |                    |           r|cd d d            S # 1 swxY w Y   d S )Nz./x86/isa_data.txtrO   z'x86 ISA data contains an invalid line 'rZ   )	openread
splitlinesrA   rj   r;   r   r   rb   )fileformats	encodingsformatrF   r   s         r&   load_instruction_set_datar     s4   	"C	(	( D))++((**/1	 	' 	'F*33F;;H(I..   S& S S STTT        X&&&&                 s   A:B<B<<C C c                    t                      }t          |t                    r|}|                    d           |S d }|D ]h}t	          | ||          }t          |t
                    r@|s|}t          t          |                    t          t          |                    k     r|}i|r|S t          j        d|  d          S )Nzx86 ISA data loading failedzCannot encode instruction 'rZ   )	r   r;   r   r   r   r	   rt   r^   r[   )rp   r   instruction_formatsr   smallest_encodingr   encodeds          r&   r   r     s    355%y11 #566615% , ,3KI\]]g~.. 	,$ ,$+!5>>""S/@)A)A%B%BBB$+! !  =E{EEEFFFr%   )9dataclassesr   r.   r   r   typingr   r   x86.machiner   r   r   r	   r
   r   r   r   x86.asmr   r   r   r   r   r   r   r   r   r   LINUX_WRITELINUX_STDOUT
LINUX_EXITr   r(   rz   Enumr-   r?   rA   r   r   r   r   r   r   r   r   r   r   r>   r   r   r   r^   r   ry   r   r   r$   r%   r&   <module>r      s   ! ! ! ! ! !                    C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C b b b b b b b b b b b b b b b b b b $ $ $ $ $ $ $ $

$        $+ + + + + + + + ]*X5) ) ) ) )49 ) ) )	-7 	-+ 	- 	- 	- 	- k k k k k k k kZh)99 nt>S     	8&66= 	QXYoQpswQw 	  }F  IM  }M 	 	 	 		#3 	 	 	 	(%55< TAQ    	"D 	"hQaFadhFh 	"  }F  IM  }M 	"  RZ  ]a  Ra 	" 	" 	" 	"+;    
+; 
 
 
 
-*: - -T[\xTy - - - -.%5%@4%G .U]`dUd .iwz~i~ . . . . h9I.ID.P ^fim^m   uC  FJ  uJ    *Wi$&6 WX\H\ Wqt W W W W,%_> %_M` %_wz %_  @N  Q]  @] %_ %_ %_ %_N LA LA LA LA LA LA LA LA\g %)"3    04(;#<y#H     G GS G^V_E_ G G G G G Gr%   