Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ClrMagicBytes:
  2.         xor     al,al
  3.  
  4. SetMagicBytes:
  5.  
  6.         test    al,4
  7.         setnz   dl
  8.         shl     dl,3
  9.         mov     [I.R],dl
  10.  
  11.         mov     bl,-1
  12.         cmovnz  ebx,[NotP4X]
  13.         mov     [I.NotR],bl
  14.  
  15.         test    al,2
  16.         setnz   dl
  17.         shl     dl,3
  18.         mov     [I.X],dl
  19.  
  20.         mov     bl,-1
  21.         cmovnz  ebx,[NotP4X]
  22.         mov     [I.NotX],bl
  23.  
  24.         test    al,1
  25.         setnz   dl
  26.         shl     dl,3
  27.         mov     [I.B],dl
  28.  
  29.         mov     bl,-1
  30.         cmovnz  ebx,[NotP4X]
  31.         mov     [I.NotB],bl
  32.  
  33.         test    al,8
  34.         setnz   [I.W]
  35.  
  36.         mov     bl,-1
  37.         cmovnz  ebx,[NotP4X]
  38.         mov     [I.NotW],bl
  39.  
  40.         test    al,40h
  41.         setnz   [I.P]
  42.  
  43.         mov     bl,-1
  44.         cmovnz  ebx,[NotP4X]
  45.         mov     [I.NotP],bl
  46.  
  47.         ret
  48.  
  49. FetchModRM:
  50.         FetchB
  51.         mov     [I.ModRM],al
  52.  
  53.         mov     cl,al
  54.         mov     bl,al
  55.         mov     dl,al
  56.         shr     cl,6    ;cl = mod
  57.         and     bl,7    ;bl = r/m
  58.         shr     dl,3
  59.         and     dl,7    ;dl = reg
  60.  
  61.         mov     [I.Mod],cl
  62.         mov     [I.Reg],dl
  63.         mov     [I.RM],bl
  64.  
  65.         call    ModRM2EA
  66.  
  67.         mov     al,[I.ModRM]
  68.         ret
  69.  
  70. TWorFW: cmp     [I.Syntax],0
  71.         jnz     .Exit
  72.         mov     [I.RandSize],VTWORD
  73.         cmp     [I.Arch],CPUX64
  74.         jz      .Exit
  75.         mov     [I.RandSize],VFWORD
  76. .Exit:
  77.         ret
  78.  
  79. SetArg2W:
  80.         cmp     [I.Fasm],0
  81.         jz      .Exit
  82.         mov     [I.Arg2.Type],GPR16
  83. .Exit:  ret
  84.  
  85. SetArg12X:
  86.         mov     [I.Arg1.Type],XMMRG
  87.         mov     [I.Arg2.Type],XMMRG
  88.         ret
  89.  
  90. RM32R32C:
  91.         call    RM32R32M
  92.  
  93.         mov     [I.Arg1.Type],GPR64
  94.         mov     [I.Arg2.Type],CTRRG
  95.  
  96.         cmp     [I.Arch],CPUX64
  97.         je      .L1
  98.         mov     [I.Arg1.Type],GPR32
  99.         ;lock mov reg,cr0 = mov reg,cr8
  100.         ;lock mov cr0,reg = mov cr8,reg
  101.         cmp     [I.Reg],0
  102.         jne     .L1
  103.         BitTR   I.Prefixes,PF0
  104.         jnc     .L1
  105.         mov     [I.Reg],8
  106. .L1:    ret
  107. ;-----------------------------------------------------------------------------
  108. CheckPrevSSE4:
  109.         mov     ecx,(EndSSE4-TabSSE4)/3
  110.         mov     edx,TabSSE4
  111. .L1:    cmp     al,[rdx]
  112.         je      .L2
  113.         add     edx,3
  114.         loop    .L1
  115.         stc
  116.         ret
  117. .L2:    mov     edx,[rdx+1]
  118.         mov     [I.Name],dx
  119.         call    rbx
  120.         mov     [I.RandSize],VQWORD+80h
  121.         clc
  122.         ret
  123. ;-----------------------------------------------------------------------------
  124. CheckNextSSE4:
  125.         mov     ecx,(EndNxtSSE4-NxtSSE4)/4
  126.         mov     edx,NxtSSE4
  127. .L1:    cmp     al,[rdx]
  128.         je      .L2
  129.         add     edx,4
  130.         loop    .L1
  131.         stc
  132.         ret
  133. .L2:    mov     ecx,[rdx+1]
  134.         mov     [I.RandSize],cl
  135.         shr     ecx,8
  136.         mov     [I.Name],cx
  137.  
  138.         cmp     al,2Ah
  139.         jne     .2A
  140.         cmp     byte [rsi],0xC0
  141.         jae     ErrorDec
  142. .2A:
  143.         cmp     al,15h
  144.         ja      .L3
  145.         mov     [I.Arg3.Type],XMMRG
  146. .L3:    call    R32RM32X
  147.         clc
  148.         ret
  149. ;-----------------------------------------------------------------------------
  150. R32RM32C:
  151.         call    R32RM32M
  152.  
  153.         mov     [I.Arg2.Type],GPR64
  154.         mov     [I.Arg1.Type],CTRRG
  155.  
  156.         cmp     [I.Arch],CPUX64
  157.         je      .L1
  158.         mov     [I.Arg2.Type],GPR32
  159.         ;lock mov reg,cr0 = mov reg,cr8
  160.         ;lock mov cr0,reg = mov cr8,reg
  161.         cmp     [I.Reg],0
  162.         jne     .L1
  163.         BitTR   I.Prefixes,PF0
  164.         jnc     .L1
  165.         mov     [I.Reg],8
  166. .L1:    ret
  167.  
  168. RM32R32D:
  169.         call    RM32R32M
  170.  
  171.         mov     [I.Arg1.Type],GPR64
  172.         mov     [I.Arg2.Type],DBGRG
  173.  
  174.         cmp     [I.Arch],CPUX64
  175.         je      .L1
  176.         mov     [I.Arg1.Type],GPR32
  177. .L1:    ret
  178.  
  179. R32RM32D:
  180.         call    R32RM32M
  181.  
  182.         mov     [I.Arg2.Type],GPR64
  183.         mov     [I.Arg1.Type],DBGRG
  184.  
  185.         cmp     [I.Arch],CPUX64
  186.         je      .L1
  187.         mov     [I.Arg2.Type],GPR32
  188. .L1:    ret
  189.  
  190. RM32R32T:
  191.         call    RM32R32M
  192.  
  193.         mov     [I.Arg1.Type],GPR64
  194.         mov     [I.Arg2.Type],TRXRG
  195.  
  196.         cmp     [I.Arch],CPUX64
  197.         je      .L1
  198.         mov     [I.Arg1.Type],GPR32
  199. .L1:    ret
  200.  
  201. R32RM32T:
  202.         call    R32RM32M
  203.  
  204.         mov     [I.Arg2.Type],GPR64
  205.         mov     [I.Arg1.Type],TRXRG
  206.  
  207.         cmp     [I.Arch],CPUX64
  208.         je      .L1
  209.         mov     [I.Arg2.Type],GPR32
  210. .L1:    ret
  211. ;-----------------------------------------------------------------------------
  212. BNDX4:  mov     [I.Arg2.Type],GPR64
  213.         mov     [I.RandSize],VQWORD+80h
  214.         cmp     [I.Arch],CPUX64
  215.         jz      .Next
  216.         mov     [I.RandSize],VDWORD+80h
  217.         mov     [I.Arg2.Type],GPR32
  218. .Next: ;jmp     BNDX1
  219. ;-----------------------------------------------------------------------------
  220. BNDX1:  mov     [I.Arg1.Type],BNDRG
  221.         ret
  222. ;-----------------------------------------------------------------------------
  223. BNDX3:  mov     [I.Arg1.Type],BNDRG
  224. BNDX2:  mov     [I.Arg2.Type],BNDRG
  225.         ret
  226. ;-----------------------------------------------------------------------------
  227. Rtn0F3A14:
  228.         mov     [I.RandSize],VBYTE+80h
  229.         mov     dx,TPEXTRB
  230. .L0:    BitTR   I.Prefixes,P66
  231.         jnc     ErrorDec
  232.         mov     [I.Name],dx
  233.         call    RM32R32X
  234.         mov     [I.Arg1.Type],GPR32
  235.         cmp     [I.W],0
  236.         jz      .L1
  237.         mov     [I.Arg1.Type],GPR64
  238. .L1:    call    ClearW
  239.         FetchB
  240.         mov     [I.Arg3.Type],80h+1
  241.         mov     [I.Arg3.ImmB],al
  242.         ret
  243. Rtn0F3A15:
  244.         mov     [I.RandSize],VWORD+80h
  245.         mov     dx,TPEXTRW
  246.         jmp     Rtn0F3A14.L0
  247. Rtn0F3A16:
  248.         mov     [I.RandSize],VDWORD+80h
  249.         mov     dx,TPEXTRD
  250.         test    [I.W],0
  251.         jz      .L1
  252.         mov     [I.RandSize],VQWORD+80h
  253.         mov     dx,TPEXTRQ
  254. .L1:    jmp     Rtn0F3A14.L0
  255. Rtn0F3A17:
  256.         mov     [I.RandSize],VDWORD+80h
  257.         mov     dx,TEXTRACTPS
  258.         jmp     Rtn0F3A14.L0
  259. Rtn0F3A20:
  260.         mov     [I.RandSize],VBYTE+80h
  261.         BitTR   I.Prefixes,P66
  262.         jnc     ErrorDec
  263.         mov     [I.Name],TPINSRB
  264.         call    R32RM32X
  265.         FetchB
  266.         mov     [I.Arg2.Type],GPR32
  267.         mov     [I.Arg3.Type],80h+1
  268.         mov     [I.Arg3.ImmB],al
  269.         ret
  270. Rtn0F3A21:
  271.         mov     [I.RandSize],VDWORD+80h
  272.         BitTR   I.Prefixes,P66
  273.         jnc     ErrorDec
  274.         mov     [I.Name],TINSERTPS
  275.         call    R32RM32X
  276.         FetchB
  277.         mov     [I.Arg3.Type],80h+1
  278.         mov     [I.Arg3.ImmB],al
  279.         ret
  280. Rtn0F3A22:
  281.         call    R32RM32X
  282.         mov     [I.RandSize],VDWORD+80h
  283.         BitTR   I.Prefixes,P66
  284.         jnc     ErrorDec
  285.         mov     dx,TPINSRD
  286.         mov     [I.Arg2.Type],GPR32
  287.         cmp     [I.W],0
  288.         jz      .L1
  289.         mov     dx,TPINSRQ
  290.         mov     [I.Arg2.Type],GPR64
  291. .L1:    mov     [I.Name],dx
  292.         call    ClearW
  293.         FetchB
  294. .L2:    mov     [I.Arg3.Type],80h+1
  295.         mov     [I.Arg3.ImmB],al
  296.         ret
  297. Rtn0F3A44:
  298.         mov     [I.RandSize],VXWORD+80h
  299.         mov     [I.Name],TPCLMULQDQ
  300.         BitTR   I.Prefixes,P66
  301.         jnc     ErrorDec
  302.         call    R32RM32X
  303.         xor     eax,eax
  304.         FetchB
  305.         cmp     al,18
  306.         ja      Rtn0F3A22.L2
  307.         mov     edx,[rax*2+TabCLMUL]
  308.         or      dx,dx
  309.         jz      Rtn0F3A22.L2
  310.         mov     [I.Name],dx
  311.         ret
  312.  
  313. SetArg3Imm:
  314.         FetchB
  315.         mov     [I.Arg3.Type],80h+1
  316.         mov     [I.Arg3.ImmB],al
  317.         ret
  318.  
  319. SetArg3CL:
  320.         mov     [I.Arg3.Type],GPR08
  321.         mov     [I.Arg3.Reg],RRCX
  322.         ret
  323.  
  324. RtnXOP: mov     ebx,R32RM32X
  325.         test    [I.FlagsXOP],XOPO
  326.         jnz     .Z1
  327.         mov     ebx,RM32R32X
  328. .Z1:    call    rbx
  329.         cmp     [I.MMMMM],8
  330.         jnz     .Z2
  331.         test    [I.FlagsXOP],XOPI
  332.         jz      .Z2
  333.         FetchB
  334.         mov     [I.Arg3.Type],80h+1
  335.         mov     [I.Arg3.ImmB],al
  336. .Z2:    ret
  337. ;-----------------------------------------------------------------------------
  338. SetVT3: push    CheckVT3
  339. SetVT:  mov     [I.Base],-1
  340.         mov     [I.Indx],-1
  341.         mov     [I.Scale],-1
  342.         mov     [I.DispSize],0
  343.  
  344.         cmp     [I.Arch],CPUX64
  345.         jz      .L1
  346.         mov     [I.Address],AD32
  347. .L1:
  348.         mov     rsi,[I.SaveRSI]
  349.         push    rax
  350.         sub     al,XMMRG-ADXX
  351.         mov     [I.VT],al
  352.         call    FetchModRM
  353.         pop     rax
  354.  
  355.         cmp     [I.Arch],CPUX64
  356.         jz      .L2
  357.         BitT    I.PrefixesCpy,P67
  358.         jnc     .L2
  359.         BitTS   I.Prefixes,P67
  360. .L2:
  361.         cmp     [I.Relative],0
  362.         jnz     ErrorDec
  363.         ret
  364. ;-----------------------------------------------------------------------------
  365. CheckVT3:
  366.         cmp     [I.Mod],3
  367.         jz      ErrorDec
  368.         ret
  369. ;-----------------------------------------------------------------------------
  370. RtnPINSR?:
  371.         test    [I.VEX],VEXW
  372.         jz      .L1
  373.         cmp     [I.Arch],CPUX64
  374.         jnz     ErrorDec
  375.         mov     [I.RandSize],VQWORD+80h
  376.         mov     [I.LastByte],'q'
  377.         mov     [I.Arg3.Type],GPR64
  378. .L1:    ret
  379. ;-----------------------------------------------------------------------------
  380. MoveKandZ:
  381.         test    byte [I.FlagsEVEX],EVEXS
  382.         jnz     .L1
  383.         mov     al,[I.AAAA]
  384.         or      al,al
  385.         jz      .L1
  386.         mov     al,'{'
  387.         stosb
  388.         cmp     [I.Syntax],0
  389.         jz      .L0
  390.         mov     al,'%'
  391.         stosb
  392. .L0:
  393.         mov     al,'k'
  394.         stosb
  395.         mov     al,[I.AAAA]
  396.         add     al,'0'
  397.         stosb
  398.         mov     al,'}'
  399.         stosb
  400. .L1:
  401.         mov     al,[I.Z]
  402.         or      al,al
  403.         jz      .L2
  404.         mov     al,'{'
  405.         stosb
  406.         mov     al,'z'
  407.         stosb
  408.         mov     al,'}'
  409.         stosb
  410. .L2:
  411.         ret
  412. ;-----------------------------------------------------------------------------
  413. GetP0P1P2:
  414.         ;P0
  415.         lodsb
  416.         cmp     rsi,r9
  417.         ja      .Error
  418.         test    al,1100b
  419.         jnz     .Error
  420.         mov     ah,al
  421.         and     al,11b
  422.         mov     [I.MMMMM],al
  423.         mov     al,ah
  424.  
  425.         test    al,10000000b
  426.         setz    [I.R]
  427.         test    al,00010000b
  428.         setz    dl
  429.         shl     dl,1
  430.         or      [I.R],dl
  431.         shl     [I.R],3
  432.  
  433.         test    al,01000000b
  434.         setz    [I.X]
  435.         shl     [I.X],3
  436.  
  437.         test    al,00100000b
  438.         setz    [I.B]
  439.         shl     [I.B],3
  440.  
  441.         mov     al,[I.X]
  442.         shl     al,1
  443.         mov     [I.XX],al
  444.  
  445.         mov     [I.P],1
  446.  
  447.         ;P1
  448.         lodsb
  449.         cmp     rsi,r9
  450.         ja      .Error
  451.         test    al,100b
  452.         jz      .Error
  453.         mov     ah,al
  454.         and     al,11b
  455.         mov     [I.PP],al
  456.         mov     al,ah
  457.         shr     al,3
  458.         and     al,1111b
  459.         xor     al,1111b
  460.         mov     [I.VVVV],al
  461.         mov     al,ah
  462.         rol     al,1
  463.         and     al,1b
  464.         mov     [I.W],al
  465.         ;P2
  466.         lodsb
  467.         cmp     rsi,r9
  468.         ja      .Error
  469.         mov     ah,al
  470.         and     al,111b
  471.         mov     [I.AAAA],al
  472.         mov     al,ah
  473.         xor     dl,dl
  474.         shl     al,1
  475.         rcl     dl,1
  476.         mov     [I.Z],dl
  477.         mov     al,ah
  478.         and     al,1000b
  479.         xor     al,1000b
  480.         jz      .L1
  481.         add     [I.V],16
  482. .L1:
  483.         shl     al,1
  484.         or      [I.VVVV],al
  485.         mov     al,ah
  486.         and     al,1100000b
  487.         cmp     al,1100000b
  488.         shr     al,5
  489.         mov     [I.LL],al
  490.         test    ah,10000b
  491.         setnz   [I.BB]
  492.         ;
  493.         movzx   eax,[I.PP]
  494.         mov     edx,[rax*4+T6200Tab]
  495.         mov     ebx,[rax*4+T6238Tab]
  496.         mov     ecx,[rax*4+T623ATab]
  497.         ;
  498.         mov     al,[I.MMMMM]
  499.         or      al,al
  500.         jz      .Error
  501.         cmp     al,00011b
  502.         jne     .L2
  503.         mov     edx,ecx
  504. .L2:
  505.         cmp     al,00010b
  506.         jne     .L3
  507.         mov     edx,ebx
  508. .L3:
  509.         lodsb
  510.         cmp     rsi,r9
  511.         ja      .Error
  512.         mov     ebx,edx
  513.         ;
  514.         mov     [I.SaveRSI],rsi
  515.         ret
  516.         ;
  517. .Error: pop     rax
  518.         jmp     BNDEVEX62.Error
  519. ;-----------------------------------------------------------------------------
  520. DetectMULT:
  521.         cmp     [I.Is62],0
  522.         jz      .L2
  523.         mov     al,[I.RandSize]
  524.         mov     ah,1
  525.         cmp     al,xW
  526.         jz      .L1
  527.         mov     ah,2
  528.         cmp     al,xD
  529.         jz      .L1
  530.         mov     ah,3
  531.         cmp     al,xQ
  532.         jz      .L1
  533.         mov     ah,4
  534.         cmp     al,xO
  535.         jz      .L1
  536.         mov     ah,5
  537.         cmp     al,xY
  538.         jz      .L1
  539.         mov     ah,6
  540.         cmp     al,xZ
  541.         jz      .L1
  542.         xor     ah,ah
  543. .L1:
  544.         mov     [I.MULT],ah
  545. .L2:
  546.         ret
  547. ;-----------------------------------------------------------------------------
  548. MoveXtoX:
  549.         cmp     [I.Mod],3
  550.         jz      .V1
  551.         cmp     [I.BB],0
  552.         jz      .V1
  553.         movzx   eax,[I.LL]
  554.         test    byte [I.FlagsEVEX+2],EVEXAA shr 16
  555.         jnz     .V0
  556.         cmp     [I.RandSize],xQ
  557.         jz      .V0
  558.         inc     eax
  559. .V0:    mov     esi,dword [rax*2+T1TO]
  560.         call    MoveStringData
  561. .V1:    ret
  562. ;-----------------------------------------------------------------------------
  563. MoveSAE1:
  564.         cmp     [I.Mod],3
  565.         jnz     .E1
  566.         test    byte [I.FlagsEVEX],EVEXO
  567.         jz      .L1
  568.         cmp     [I.W],0
  569.         jz      .E1
  570. .L1:
  571.         test    byte [I.FlagsEVEX],EVEXR
  572.         jz      .E2
  573.         cmp     [I.BB],0
  574.         jz      .E1
  575.         mov     al,','
  576.         stosb
  577.         movzx   eax,[I.LL]
  578.         mov     esi,dword [rax*2+TSAE]
  579.         call    MoveStringData
  580. .E1:    ret
  581. .E2:    cmp     [I.BB],0
  582.         jz      .E3
  583.         cmp     [I.LL],00b
  584.         jnz     .E3
  585. if %B=64
  586.         mov     rax,',{sae}'
  587.         stosq
  588.         sub     rdi,2
  589. else
  590.         mov     ax,',{'
  591.         stosw
  592.         mov     eax,'sae}'
  593.         stosd
  594. end if
  595. .E3:    ret
  596. ;-----------------------------------------------------------------------------
  597. MoveSAE2:
  598.         cmp     [I.Mod],3
  599.         jnz     .E1
  600.         test    byte [I.FlagsEVEX],EVEXO
  601.         jz      .L1
  602.         cmp     [I.W],0
  603.         jz      .E1
  604. .L1:
  605.         test    byte [I.FlagsEVEX],EVEXR
  606.         jz      .E2
  607.         cmp     [I.BB],0
  608.         jz      .E1
  609.         movzx   eax,[I.LL]
  610.         mov     esi,dword [rax*2+TSAE]
  611.         call    MoveStringData
  612.         mov     al,','
  613.         stosb
  614. .E1:    ret
  615. .E2:    cmp     [I.BB],0
  616.         jz      .E3
  617.         cmp     [I.LL],00b
  618.         jnz     .E3
  619. if %B=64
  620.         mov     rax,'{sae},'
  621.         stosq
  622.         sub     rdi,2
  623. else
  624.         mov     eax,'{sae'
  625.         stosd
  626.         mov     ax,'},'
  627.         stosw
  628. end if
  629. .E3:    ret
  630. ;-----------------------------------------------------------------------------
  631. GetVectorAL:
  632.         test    byte [I.FlagsEVEX],EVEXX
  633.         jnz     .L1
  634.         mov     al,ZMMRG
  635.         cmp     [I.BB],0
  636.         jnz     .L0
  637.         test    [I.LL],10b
  638.         jnz     .L0
  639.         mov     al,YMMRG
  640.         test    [I.LL],01b
  641.         jnz     .L0
  642. .L1:    mov     al,XMMRG
  643. .L0:    ret
  644. ;-----------------------------------------------------------------------------
  645. GetVectorAndMUL:
  646.         test    byte [I.FlagsEVEX],EVEXX
  647.         jnz     .L4
  648.         ;
  649.         mov     ah,[I.LL]
  650.  
  651.         mov     al,ZMMRG
  652.         ;
  653.         cmp     [I.Mod],3
  654.         jnz     .LX
  655.         cmp     [I.BB],0
  656.         jnz     .L0
  657. .LX:    ;
  658.         test    ah,10b
  659.         jnz     .L0
  660.         mov     al,YMMRG
  661.         test    ah,01b
  662.         jnz     .L0
  663.         mov     al,XMMRG
  664.         ;
  665. .L0:    mov     ah,al
  666.         ;
  667.         cmp     [I.BB],0
  668.         jnz     .L3
  669.         cmp     al,YMMRG
  670.         jz      .L2
  671.         ja      .L1
  672.         ret
  673.         ;
  674. .L1:    call    .L2
  675. .L2:    inc     [I.RandSize]
  676. .L3:    ret
  677. .L4:    mov     al,XMMRG
  678.         mov     ah,al
  679.         ret
  680. ;-----------------------------------------------------------------------------
  681. GetRDRQAH:
  682.         mov     ah,GPR32
  683.         cmp     [I.W],1
  684.         jnz     .L1
  685.         mov     ah,GPR64
  686. .L1:    ret
  687. ;-----------------------------------------------------------------------------
  688. GetRDRQAL:
  689.         mov     al,GPR32
  690.         cmp     [I.W],1
  691.         jnz     .L1
  692.         mov     al,GPR64
  693. .L1:    ret
  694.