
    g                         S r SSKJr  SSKJrJr  SSKJrJr  SSK	J
r
  SSKJr  SSKJr  \" SS	9 " S
 S5      5       r\" SS	9 " S S5      5       r\\-  \
-  r\ " S S5      5       rS\S   S\\   \-  4S jrg)zrThis module is responsible for representing and loading the specific instruction encoding formats for each opcode.    )	dataclass)LiteralSelf)Opcode	ThreeBits)Register)Mnemonic)	TracebackT)frozenc                   4    \ rS rSr% \S   \S'   Sr\\S'   Srg)ImmediateType
   )            sizeFis_relative N)	__name__
__module____qualname____firstlineno__r   __annotations__r   bool__static_attributes__r       5/mnt/public/Repos/urclelf/./x86/encoding/encodings.pyr   r   
   s    
*
Kr   r   c                   0    \ rS rSr% Sr\S   S-  \S'   Srg)RegisterSize   N)r          @   r   r   )r   r   r   r   r   r   r   r   r   r   r   r    r       s    *.D'-
 4
'.r   r    c                   r    \ rS rSr% \\S'   \\S'   \S-  \S'   \\	   \S'   \
S\S\S	   4S
 j5       rS rSrg)InstructionEncodingFormat   mnemonicopcodeNopcode_extentionpermitted_operandsencodingbitsr#   r$   c                 ,   [        SS5      nSU ;  a  [        R                  " SU  S35      $ U R                  SSS9u  p4SU;   aj  UR                  SSS9u  p5[	        U5      nUS:X  dF  US:X  d@  US	:X  d:  US
:X  d4  US:X  d.  US:X  d(  US:X  d"  US:X  d  [        R                  " SU SU 35      $ OS n[         R
                  " [        R                  U5      5      nUR                  5       nU(       d1  [        R                  " S[        U5      R                  5        S35      $ Utpx[        U5      n	/ n
U GHQ  n[        R                  " U5      nU(       a  U
R                  U5        M4  US:X  a3  U
R                  [        UR                  5       (       a  UOS5      5        Mm  US:X  a  U
R                  [        S5      5        M  US:X  a  U
R                  [        S5      5        M  US:X  a  U
R                  [        S5      5        M  US:X  a  U
R                  [        S5      5        M  US:X  a  U
R                  [        SS5      5        GM  US:X  a  U
R                  [        S	S5      5        GM=  US:X  a  U
R                  [        SS5      5        GMa  US:X  a  U
R                  [        SS5      5        GM  US :X  a  U
R                  [        SS!5      5        GM  US":X  a  U
R                  [        S	S!5      5        GM  US#:X  a  U
R                  [        SS!5      5        GM  US$:X  a  U
R                  [        SS!5      5        GM  US%:X  a  GM  [        R                  " S&[        U5      R                  5        S'U S(35      s  $    [!        XXj5      $ ))NFr   :z
Encoding 'z' is missing ':'r   )maxsplit.r      r            zOpcode 'z' has invalid extention zEncoding of opcode z is missingrr   r8r16r"   r32r#   r64r$   i8i16i32i64rel8Trel16rel32rel64eszUnknown operand for opcode z: '')r   r
   newsplitint
from_bytesbytesfromhexhexr	   r   	from_nameappendr    get_register_size_bitr   r&   )r,   r-   r)   
opcode_strrestopcode_extention_strr*   mnemonic_stroperandsr(   operand_formatsoperandregs                r   from_str"InstructionEncodingFormat.from_str   sg    q!h==:hZ7G!HII#>>#>:
*/9/?/?a/?/P,J"#78$)-=-BFVZ[F[_ost_t  yI  MN  yN  Rb  fg  Rg  k{  @  k@  DT  XY  DY }}x
|;STdSe%fgg#""5==#<=zz|==#6uV}7H7H7J6K;!WXX"&L)-/G$$W-C&&s+C&&|F<X<X<Z<ZD`a'bcD&&|A7E!&&|B'78E!&&|B'78E!&&|B'78D&&}Q'>?E!&&}Q'>?E!&&}Q'>?E!&&}Q'>?F"&&}Q'=>G#&&}Q'=>G#&&}Q'=>G#&&}Q'=>D }}'B5=CTCTCVBWWZ[bZccd%effC  F );K]]r   c                 \    U R                    H  n[        U[        5      (       d  M  Us  $    g )N)r+   
isinstancer   )selfoperand_formats     r   get_immediate'InstructionEncodingFormat.get_immediateV   s%    "55N.-88%% 6r   r   )r   r   r   r   r	   r   r   r   listOperandTypestaticmethodstrr   rX   r^   r   r   r   r   r&   r&      sQ    N$&&[))7^3 7^gfo 7^ 7^r&r   r&   r-   r.   returnc                 z   U S:X  a  SnOSn[        US5       nUR                  5       R                  5       n/ nU Hb  n[        R	                  XP5      n[        U[        5      (       a$  UnUR                  SU S35        Us  sS S S 5        $ UR                  U5        Md     UsS S S 5        $ ! , (       d  f       g = f)Nr$   z./x86/encoding/isa_data_x64.txtz./x86/encoding/isa_data_x86.txtr7   z'x86 ISA data contains an invalid line 'rE   )	openread
splitlinesr&   rX   r[   r
   	elaboraterN   )r-   pathfileformats	encodingsformatr,   errors           r   load_instruction_set_datarp   \   s    rz00	dCD))+((*57	F099&GH(I.. "I&QR ST 
 X&   
s   A*B,B,,
B:N)__doc__dataclassesr   typingr   r   x86.encoding.machiner   r   x86.registerr   x86.asmr	   ro   r
   r   r    ra   r&   r`   rp   r   r   r   <module>rw      s    t !   2 !  
$   $/ / / ]*X5
D& D& D&LGFO =V8WZc8c r   