instruction.byte8.inc

Переключить прокрутку окна
Загрузить этот исходный код

;
 ;  Исходный код среды исполнения ПВТ-ОО.
 ;
 ;  Этот исходный код является частью проекта ПВТ-ОО.
 ;
 ;  Copyright © 2021 Малик Разработчик
 ;
 ;  Это свободная программа: вы можете перераспространять её и/или
 ;  изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
 ;  в каком она была опубликована Фондом свободного программного обеспечения;
 ;  либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
 ;
 ;  Эта программа распространяется в надежде, что она может быть полезна,
 ;  но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
 ;  или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
 ;  общественной лицензии GNU.
 ;
 ;  Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
 ;  вместе с этой программой. Если это не так, см.
 ;  <http://www.gnu.org/licenses/>.
;

; <fold push/pop/peek>
    if(used inst$b8push) ; <fold >
        inst b8push ; (value in xmm0)
                    push1
                    vmovdqa xword[rsp], xmm0
                    set     TAG_BYTE8
        end_inst
    end if ; </fold>

    if(used inst$b8pop) ; <fold >
        inst b8pop ; (): value in xmm0
                    overify TAG_BYTE8
                    vmovq   xmm0, [rsp]
                    pop1set
        end_inst
    end if ; </fold>
; </fold>

; <fold conversion>
    if(used inst$b8tob) ; <fold >
        inst b8tob
                    overify TAG_BYTE8
                    movsx   eax, byte[rsp]
                    vmovd   xmm0, eax
                    vmovdqa xword[rsp], xmm0
                    set     TAG_INT
        end_inst
    end if ; </fold>

    if(used inst$b8tob2) ; <fold >
        inst b8tob2
                    overify TAG_BYTE8
                    vmovdqa xmm0, [rsp]
                    vpand   xmm0, xmm0, [b8.03]
                    vmovdqa xword[rsp], xmm0
                    set     TAG_BYTE2
        end_inst
    end if ; </fold>

    if(used inst$b8tob4) ; <fold >
        inst b8tob4
                    overify TAG_BYTE8
                    vmovdqa xmm0, [rsp]
                    vpand   xmm0, xmm0, [b8.02]
                    vmovdqa xword[rsp], xmm0
                    set     TAG_BYTE4
        end_inst
    end if ; </fold>

    if(used inst$b8tos8) ; <fold >
        inst b8tos8
                    overify TAG_BYTE8
                    vpmovsxbw xmm0, [rsp]
                    vmovdqa xword[rsp], xmm0
                    set     TAG_SHORT8
        end_inst
    end if ; </fold>

    if(used inst$b8toi8) ; <fold >
        inst b8toi8
                    overify TAG_BYTE8
                    push1
                    vpmovsxbd ymm0, [rsp+$10]
                    vmovdqu yword[rsp], ymm0
                    set     TAG_INT8
        end_inst
    end if ; </fold>

    if(used inst$b8tol8) ; <fold >
        inst b8tol8
                    overify TAG_BYTE8
                    push3
                    vpmovsxbq zmm0, [rsp+$30]
                    vmovdqu64 zword[rsp], zmm0
                    set     TAG_LONG8
        end_inst
    end if ; </fold>
; </fold>

; <fold relation>
    if(used inst$b8se) ; <fold >
        inst b8se
                    overify TAG_BYTE8, TAG_BYTE8
                    vpmovsxbd ymm0, [rsp+$10]
                    vpmovsxbd ymm1, [rsp+$00]
                    vpcmpeqd ymm0, ymm0, ymm1
                    vmovmskps eax, ymm0
                    cmp     eax, $ff
                    sete    al
                    movsx   eax, al
                    vmovd   xmm0, eax
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set TAG_INT
        end_inst
    end if ; </fold>

    if(used inst$b8sne) ; <fold >
        inst b8sne
                    overify TAG_BYTE8, TAG_BYTE8
                    vpmovsxbd ymm0, [rsp+$10]
                    vpmovsxbd ymm1, [rsp+$00]
                    vpcmpeqd ymm0, ymm0, ymm1
                    vmovmskps eax, ymm0
                    cmp     eax, $ff
                    setne   al
                    movsx   eax, al
                    vmovd   xmm0, eax
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set TAG_INT
        end_inst
    end if ; </fold>
; </fold>

; <fold bitwise>
    if(used inst$b8not) ; <fold >
        inst b8not
                    overify TAG_BYTE8
                    vmovdqa xmm0, [rsp]
                    vpxor   xmm0, xmm0, [b8.01]
                    vmovdqa xword[rsp], xmm0
        end_inst
    end if ; </fold>

    if(used inst$b8and) ; <fold >
        inst b8and
                    overify TAG_BYTE8, TAG_BYTE8
                    vmovdqa xmm0, [rsp+$10]
                    vpand   xmm0, xmm0, [rsp]
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$b8or) ; <fold >
        inst b8or
                    overify TAG_BYTE8, TAG_BYTE8
                    vmovdqa xmm0, [rsp+$10]
                    vpor    xmm0, xmm0, [rsp]
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$b8xor) ; <fold >
        inst b8xor
                    overify TAG_BYTE8, TAG_BYTE8
                    vmovdqa xmm0, [rsp+$10]
                    vpxor   xmm0, xmm0, [rsp]
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>
; </fold>

; <fold scalar>
    if(used inst$b8sneg) ; <fold >
        inst b8sneg
                    overify TAG_BYTE8
                    push1
                    vpmovsxbd ymm0, [rsp+$10]
                    vpxor   ymm1, ymm0, ymm0
                    vpsubd  ymm0, ymm1, ymm0
                    vmovdqu yword[rsp], ymm0
                    set     TAG_INT8
        end_inst
    end if ; </fold>

    if(used inst$b8smul) ; <fold >
        inst b8smul
                    overify TAG_BYTE8, TAG_BYTE8
                    vpmovsxbd ymm0, [rsp+$10]
                    vpmovsxbd ymm1, [rsp+$00]
                    vmovdqa ymm8, ymm1
                    vextracti128 xmm12, ymm8, $01
                    vinserti128 ymm12, ymm12, xmm8, $01
                    vshufps ymm9, ymm8, ymm8, $b1
                    vshufps ymm10, ymm8, ymm8, $4e
                    vshufps ymm11, ymm8, ymm8, $1b
                    vshufps ymm13, ymm12, ymm12, $b1
                    vshufps ymm14, ymm12, ymm12, $4e
                    vshufps ymm15, ymm12, ymm12, $1b
                    vpmulld ymm8, ymm8, [i8.o0]
                    vpmulld ymm9, ymm9, [i8.o1]
                    vpmulld ymm10, ymm10, [i8.o2]
                    vpmulld ymm11, ymm11, [i8.o3]
                    vpmulld ymm12, ymm12, [i8.o4]
                    vpmulld ymm13, ymm13, [i8.o5]
                    vpmulld ymm14, ymm14, [i8.o6]
                    vpmulld ymm15, ymm15, [i8.o7]
                    vpmulld ymm7, ymm0, ymm15
                    vpmulld ymm6, ymm0, ymm14
                    vpmulld ymm5, ymm0, ymm13
                    vpmulld ymm4, ymm0, ymm12
                    vpmulld ymm3, ymm0, ymm11
                    vpmulld ymm2, ymm0, ymm10
                    vpmulld ymm1, ymm0, ymm9
                    vpmulld ymm0, ymm0, ymm8
                    vphaddd ymm0, ymm0, ymm1
                    vphaddd ymm1, ymm2, ymm3
                    vphaddd ymm2, ymm4, ymm5
                    vphaddd ymm3, ymm6, ymm7
                    vphaddd ymm0, ymm0, ymm1
                    vphaddd ymm1, ymm2, ymm3
                    vextracti128 xmm2, ymm0, $01
                    vextracti128 xmm3, ymm1, $01
                    vpaddd  xmm0, xmm0, xmm2
                    vpaddd  xmm1, xmm1, xmm3
                    vinserti128 ymm0, ymm0, xmm1, $01
                    vmovdqu yword[rsp], ymm0
                    set     TAG_INT8
        end_inst
    end if ; </fold>

    if(used inst$b8sadd) ; <fold >
        inst b8sadd
                    overify TAG_BYTE8, TAG_BYTE8
                    vpmovsxbd ymm0, [rsp+$10]
                    vpmovsxbd ymm1, [rsp+$00]
                    vpaddd  ymm0, ymm0, ymm1
                    vmovdqu yword[rsp], ymm0
                    set     TAG_INT8
        end_inst
    end if ; </fold>

    if(used inst$b8ssub) ; <fold >
        inst b8ssub
                    overify TAG_BYTE8, TAG_BYTE8
                    vpmovsxbd ymm0, [rsp+$10]
                    vpmovsxbd ymm1, [rsp+$00]
                    vpsubd  ymm0, ymm0, ymm1
                    vmovdqu yword[rsp], ymm0
                    set     TAG_INT8
        end_inst
    end if ; </fold>

    if(used inst$b8ssar) ; <fold >
        inst b8ssar
                    overify TAG_BYTE8, TAG_INT
                    mov     ecx, [rsp]
                    and     ecx, $1f
                    vpmovsxbd ymm0, [rsp+$10]
                    vmovd   xmm1, ecx
                    vpsrad  ymm0, ymm0, xmm1
                    vmovdqu yword[rsp], ymm0
                    set     TAG_INT8
        end_inst
    end if ; </fold>

    if(used inst$b8ssal) ; <fold >
        inst b8ssal
                    overify TAG_BYTE8, TAG_INT
                    mov     ecx, [rsp]
                    and     ecx, $1f
                    vpmovsxbd ymm0, [rsp+$10]
                    vmovd   xmm1, ecx
                    vpslld  ymm0, ymm0, xmm1
                    vmovdqu yword[rsp], ymm0
                    set     TAG_INT8
        end_inst
    end if ; </fold>

    if(used inst$b8sshr) ; <fold >
        inst b8sshr
                    overify TAG_BYTE8, TAG_INT
                    mov     ecx, [rsp]
                    and     ecx, $1f
                    vpmovsxbd ymm0, [rsp+$10]
                    vmovd   xmm1, ecx
                    vpsrld  ymm0, ymm0, xmm1
                    vmovdqu yword[rsp], ymm0
                    set     TAG_INT8
        end_inst
    end if ; </fold>
; </fold>

; <fold vector>
    if(used inst$b8vunpckl) ; <fold >
        inst b8vunpckl
                    overify TAG_BYTE8
                    vmovdqa xmm0, [rsp]
                    vpxor   xmm1, xmm0, xmm0
                    vpunpcklbw xmm0, xmm0, xmm1
                    vmovdqa xword[rsp], xmm0
                    set     TAG_SHORT8
        end_inst
    end if ; </fold>

    if(used inst$b8vunpcku) ; <fold >
        inst b8vunpcku
                    overify TAG_BYTE8
                    vmovdqa xmm0, [rsp]
                    vpxor   xmm1, xmm0, xmm0
                    vpunpcklbw xmm0, xmm1, xmm0
                    vmovdqa xword[rsp], xmm0
                    set     TAG_SHORT8
        end_inst
    end if ; </fold>

    if(used inst$b8vneg) ; <fold >
        inst b8vneg
                    overify TAG_BYTE8
                    vpxor   xmm0, xmm0, xmm0
                    vpsubb  xmm0, xmm0, [rsp]
                    vmovdqa xword[rsp], xmm0
        end_inst
    end if ; </fold>

    if(used inst$b8vmul) ; <fold >
        inst b8vmul
                    overify TAG_BYTE8, TAG_BYTE8
                    vpmovzxbw xmm0, [rsp+$10]
                    vpmovzxbw xmm1, [rsp+$00]
                    vpmullw xmm0, xmm0, xmm1
                    vpand   xmm0, xmm0, [s8.00]
                    vpxor   xmm1, xmm0, xmm0
                    vpackuswb xmm0, xmm0, xmm1
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$b8vadd) ; <fold >
        inst b8vadd
                    overify TAG_BYTE8, TAG_BYTE8
                    vmovdqa xmm0, [rsp+$10]
                    vpaddb  xmm0, xmm0, [rsp]
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$b8vsub) ; <fold >
        inst b8vsub
                    overify TAG_BYTE8, TAG_BYTE8
                    vmovdqa xmm0, [rsp+$10]
                    vpsubb  xmm0, xmm0, [rsp]
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$b8vsar) ; <fold >
        inst b8vsar
                    overify TAG_BYTE8, TAG_INT
                    mov     ecx, [rsp]
                    and     ecx, $1f
                    vpmovsxbw xmm0, [rsp+$10]
                    vmovd   xmm1, ecx
                    vpsraw  xmm0, xmm0, xmm1
                    vpand   xmm0, xmm0, [s8.00]
                    vpxor   xmm1, xmm0, xmm0
                    vpackuswb xmm0, xmm0, xmm1
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$b8vsal) ; <fold >
        inst b8vsal
                    overify TAG_BYTE8, TAG_INT
                    mov     ecx, [rsp]
                    and     ecx, $1f
                    vpmovsxbw xmm0, [rsp+$10]
                    vmovd   xmm1, ecx
                    vpsllw  xmm0, xmm0, xmm1
                    vpand   xmm0, xmm0, [s8.00]
                    vpxor   xmm1, xmm0, xmm0
                    vpackuswb xmm0, xmm0, xmm1
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$b8vshr) ; <fold >
        inst b8vshr
                    overify TAG_BYTE8, TAG_INT
                    mov     ecx, [rsp]
                    and     ecx, $1f
                    vpmovzxbw xmm0, [rsp+$10]
                    vmovd   xmm1, ecx
                    vpsrlw  xmm0, xmm0, xmm1
                    vpand   xmm0, xmm0, [s8.00]
                    vpxor   xmm1, xmm0, xmm0
                    vpackuswb xmm0, xmm0, xmm1
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$b8vg) ; <fold >
        inst b8vg
                    overify TAG_BYTE8, TAG_BYTE8
                    vmovdqa xmm0, [rsp+$10]
                    vpcmpgtb xmm0, xmm0, [rsp]
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$b8vge) ; <fold >
        inst b8vge
                    overify TAG_BYTE8, TAG_BYTE8
                    vmovdqa xmm0, [rsp]
                    vpcmpgtb xmm0, xmm0, [rsp+$10]
                    vpxor   xmm0, xmm0, [b8.01]
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$b8vl) ; <fold >
        inst b8vl
                    overify TAG_BYTE8, TAG_BYTE8
                    vmovdqa xmm0, [rsp]
                    vpcmpgtb xmm0, xmm0, [rsp+$10]
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$b8vle) ; <fold >
        inst b8vle
                    overify TAG_BYTE8, TAG_BYTE8
                    vmovdqa xmm0, [rsp+$10]
                    vpcmpgtb xmm0, xmm0, [rsp]
                    vpxor   xmm0, xmm0, [b8.01]
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$b8ve) ; <fold >
        inst b8ve
                    overify TAG_BYTE8, TAG_BYTE8
                    vmovdqa xmm0, [rsp+$10]
                    vpcmpeqb xmm0, xmm0, [rsp]
                    vpand   xmm0, xmm0, [b8.01]
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$b8vne) ; <fold >
        inst b8vne
                    overify TAG_BYTE8, TAG_BYTE8
                    vmovdqa xmm0, [rsp+$10]
                    vpcmpeqb xmm0, xmm0, [rsp]
                    vpxor   xmm0, xmm0, [b8.00]
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$b8vmuls) ; <fold >
        inst b8vmuls
                    overify TAG_BYTE8, TAG_BYTE8
                    vpmovsxbw xmm0, [rsp+$10]
                    vpmovsxbw xmm1, [rsp+$00]
                    vpmullw xmm0, xmm0, xmm1
                    vpaddw  xmm0, xmm0, [s8.05]
                    vpsraw  xmm0, xmm0, $07
                    vpacksswb xmm0, xmm0, xmm0
                    vpand   xmm0, xmm0, [b8.01]
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$b8vadds) ; <fold >
        inst b8vadds
                    overify TAG_BYTE8, TAG_BYTE8
                    vmovdqa xmm0, [rsp+$10]
                    vpaddsb xmm0, xmm0, [rsp]
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$b8vsubs) ; <fold >
        inst b8vsubs
                    overify TAG_BYTE8, TAG_BYTE8
                    vmovdqa xmm0, [rsp+$10]
                    vpsubsb xmm0, xmm0, [rsp]
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$b8vmulu) ; <fold >
        inst b8vmulu
                    overify TAG_BYTE8, TAG_BYTE8
                    vpmovzxbw xmm0, [rsp+$10]
                    vpmovzxbw xmm1, [rsp+$00]
                    vpmullw xmm0, xmm0, xmm1
                    vpaddw  xmm0, xmm0, [s8.00]
                    vpsrlw  xmm0, xmm0, $08
                    vpackuswb xmm0, xmm0, xmm0
                    vpand   xmm0, xmm0, [b8.01]
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$b8vaddu) ; <fold >
        inst b8vaddu
                    overify TAG_BYTE8, TAG_BYTE8
                    vmovdqa xmm0, [rsp+$10]
                    vpaddusb xmm0, xmm0, [rsp]
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$b8vsubu) ; <fold >
        inst b8vsubu
                    overify TAG_BYTE8, TAG_BYTE8
                    vmovdqa xmm0, [rsp+$10]
                    vpsubusb xmm0, xmm0, [rsp]
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set
        end_inst
    end if ; </fold>
; </fold>