instruction.int8.inc

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

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

; <fold push/pop/peek>
    if(used inst$i8push) ; <fold >
        inst i8push ; (value in ymm0)
                    push2
                    vmovdqu yword[rsp], ymm0
                    set     TAG_INT8
        end_inst
    end if ; </fold>

    if(used inst$i8pop) ; <fold >
        inst i8pop ; (): value in ymm0
                    overify TAG_INT8
                    vmovdqu ymm0, [rsp]
                    pop2set
        end_inst
    end if ; </fold>
; </fold>

; <fold conversion>
    if(used inst$i8tob8) ; <fold >
        inst i8tob8
                    overify TAG_INT8
                    vmovdqu ymm0, [rsp]
                    vpand   ymm0, ymm0, [i8.03]
                    vpxor   xmm2, xmm0, xmm0
                    vextracti128 xmm1, ymm0, $01
                    vpackusdw xmm0, xmm0, xmm1
                    vpackuswb xmm0, xmm0, xmm2
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set TAG_BYTE8
        end_inst
    end if ; </fold>

    if(used inst$i8tos8) ; <fold >
        inst i8tos8
                    overify TAG_INT8
                    vmovdqu ymm0, [rsp]
                    vpand   ymm0, ymm0, [i8.02]
                    vextracti128 xmm1, ymm0, $01
                    vpackusdw xmm0, xmm0, xmm1
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set TAG_SHORT8
        end_inst
    end if ; </fold>

    if(used inst$i8toi) ; <fold >
        inst i8toi
                    overify TAG_INT8
                    vmovd   xmm0, [rsp]
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set TAG_INT
        end_inst
    end if ; </fold>

    if(used inst$i8toi2) ; <fold >
        inst i8toi2
                    overify TAG_INT8
                    vmovq   xmm0, [rsp]
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set TAG_INT2
        end_inst
    end if ; </fold>

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

    if(used inst$i8tol8) ; <fold >
        inst i8tol8
                    overify TAG_INT8
                    push2
                    vmovdqu ymm0, [rsp+$20]
                    vpmovsxdq zmm0, ymm0
                    vmovdqu64 zword[rsp], zmm0
                    set     TAG_LONG8
        end_inst
    end if ; </fold>

    if(used inst$i8tof8) ; <fold >
        inst i8tof8
                    overify TAG_INT8
                    vmovdqu ymm0, [rsp]
                    vcvtdq2ps ymm0, ymm0
                    vmovdqu yword[rsp], ymm0
                    set     TAG_FLOAT8
        end_inst
    end if ; </fold>

    if(used inst$i8tod8) ; <fold >
        inst i8tod8
                    overify TAG_INT8
                    push2
                    vmovdqu ymm0, [rsp+$20]
                    vcvtdq2pd zmm0, ymm0
                    vmovdqu64 zword[rsp], zmm0
                    set     TAG_DOUBLE8
        end_inst
    end if ; </fold>
; </fold>

; <fold relation>
    if(used inst$i8se) ; <fold >
        inst i8se
                    overify TAG_INT8, TAG_INT8
                    vmovdqu ymm0, [rsp+$20]
                    vmovdqu ymm1, [rsp+$00]
                    vpcmpeqd ymm0, ymm0, ymm1
                    vmovmskps eax, ymm0
                    cmp     eax, $ff
                    sete    al
                    movsx   eax, al
                    vmovd   xmm0, eax
                    vmovdqa xword[rsp+$30], xmm0
                    pop3set TAG_INT
        end_inst
    end if ; </fold>

    if(used inst$i8sne) ; <fold >
        inst i8sne
                    overify TAG_INT8, TAG_INT8
                    vmovdqu ymm0, [rsp+$20]
                    vmovdqu ymm1, [rsp+$00]
                    vpcmpeqd ymm0, ymm0, ymm1
                    vmovmskps eax, ymm0
                    cmp     eax, $ff
                    setne   al
                    movsx   eax, al
                    vmovd   xmm0, eax
                    vmovdqa xword[rsp+$30], xmm0
                    pop3set TAG_INT
        end_inst
    end if ; </fold>
; </fold>

; <fold bitwise>
    if(used inst$i8not) ; <fold >
        inst i8not
                    overify TAG_INT8
                    vmovdqu ymm0, [rsp]
                    vpxor   ymm0, ymm0, [i8.01]
                    vmovdqu yword[rsp], ymm0
        end_inst
    end if ; </fold>

    if(used inst$i8and) ; <fold >
        inst i8and
                    overify TAG_INT8, TAG_INT8
                    vmovdqu ymm0, [rsp+$20]
                    vmovdqu ymm1, [rsp+$00]
                    vpand   ymm0, ymm0, ymm1
                    vmovdqu yword[rsp+$20], ymm0
                    pop2set
        end_inst
    end if ; </fold>

    if(used inst$i8or) ; <fold >
        inst i8or
                    overify TAG_INT8, TAG_INT8
                    vmovdqu ymm0, [rsp+$20]
                    vmovdqu ymm1, [rsp+$00]
                    vpor    ymm0, ymm0, ymm1
                    vmovdqu yword[rsp+$20], ymm0
                    pop2set
        end_inst
    end if ; </fold>

    if(used inst$i8xor) ; <fold >
        inst i8xor
                    overify TAG_INT8, TAG_INT8
                    vmovdqu ymm0, [rsp+$20]
                    vmovdqu ymm1, [rsp+$00]
                    vpxor   ymm0, ymm0, ymm1
                    vmovdqu yword[rsp+$20], ymm0
                    pop2set
        end_inst
    end if ; </fold>
; </fold>

; <fold scalar>
    if(used inst$i8sneg | used inst$i8vneg) ; <fold >
        inst i8sneg, i8vneg
                    overify TAG_INT8
                    vmovdqu ymm0, [rsp]
                    vpxor   ymm1, ymm0, ymm0
                    vpsubd  ymm0, ymm1, ymm0
                    vmovdqu yword[rsp], ymm0
        end_inst
    end if ; </fold>

    if(used inst$i8smul) ; <fold >
        inst i8smul
                    overify TAG_INT8, TAG_INT8
                    vmovdqu ymm0, [rsp+$20]
                    vmovdqu 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+$20], ymm0
                    pop2set
        end_inst
    end if ; </fold>

    if(used inst$i8sadd | used inst$i8vadd) ; <fold >
        inst i8sadd, i8vadd
                    overify TAG_INT8, TAG_INT8
                    vmovdqu ymm0, [rsp+$20]
                    vmovdqu ymm1, [rsp+$00]
                    vpaddd  ymm0, ymm0, ymm1
                    vmovdqu yword[rsp+$20], ymm0
                    pop2set
        end_inst
    end if ; </fold>

    if(used inst$i8ssub | used inst$i8vsub) ; <fold >
        inst i8ssub, i8vsub
                    overify TAG_INT8, TAG_INT8
                    vmovdqu ymm0, [rsp+$20]
                    vmovdqu ymm1, [rsp+$00]
                    vpsubd  ymm0, ymm0, ymm1
                    vmovdqu yword[rsp+$20], ymm0
                    pop2set
        end_inst
    end if ; </fold>

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

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

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

; <fold vector>
    if(used inst$i8vpack) ; <fold >
        inst i8vpack
                    overify TAG_INT8
                    vmovdqu ymm0, [rsp]
                    vextracti128 xmm1, ymm0, $01
                    vpackusdw xmm0, xmm0, xmm1
                    vmovdqa xword[rsp+$10], xmm0
                    pop1set TAG_SHORT8
        end_inst
    end if ; </fold>

    if(used inst$i8vunpckl) ; <fold >
        inst i8vunpckl
                    overify TAG_INT8
                    push2
                    vmovdqu ymm0, [rsp+$20]
                    vpmovzxdq zmm0, ymm0
                    vmovdqu64 zword[rsp], zmm0
                    set     TAG_LONG8
        end_inst
    end if ; </fold>

    if(used inst$i8vunpcku) ; <fold >
        inst i8vunpcku
                    overify TAG_INT8
                    push2
                    vmovdqu ymm0, [rsp+$20]
                    vpmovzxdq zmm0, ymm0
                    vpsllq  zmm0, zmm0, $20
                    vmovdqu64 zword[rsp], zmm0
                    set     TAG_LONG8
        end_inst
    end if ; </fold>

    if(used inst$i8vmul) ; <fold >
        inst i8vmul
                    overify TAG_INT8, TAG_INT8
                    vmovdqu ymm0, [rsp+$20]
                    vmovdqu ymm1, [rsp+$00]
                    vpmulld ymm0, ymm0, ymm1
                    vmovdqu yword[rsp+$20], ymm0
                    pop2set
        end_inst
    end if ; </fold>

    if(used inst$i8vg) ; <fold >
        inst i8vg
                    overify TAG_INT8, TAG_INT8
                    vmovdqu ymm0, [rsp+$20]
                    vmovdqu ymm1, [rsp+$00]
                    vpcmpgtd ymm0, ymm0, ymm1
                    vmovdqu yword[rsp+$20], ymm0
                    pop2set
        end_inst
    end if ; </fold>

    if(used inst$i8vge) ; <fold >
        inst i8vge
                    overify TAG_INT8, TAG_INT8
                    vmovdqu ymm0, [rsp+$20]
                    vmovdqu ymm1, [rsp+$00]
                    vpcmpgtd ymm0, ymm1, ymm0
                    vpxor   ymm0, ymm0, [i8.01]
                    vmovdqu yword[rsp+$20], ymm0
                    pop2set
        end_inst
    end if ; </fold>

    if(used inst$i8vl) ; <fold >
        inst i8vl
                    overify TAG_INT8, TAG_INT8
                    vmovdqu ymm0, [rsp+$20]
                    vmovdqu ymm1, [rsp+$00]
                    vpcmpgtd ymm0, ymm1, ymm0
                    vmovdqu yword[rsp+$20], ymm0
                    pop2set
        end_inst
    end if ; </fold>

    if(used inst$i8vle) ; <fold >
        inst i8vle
                    overify TAG_INT8, TAG_INT8
                    vmovdqu ymm0, [rsp+$20]
                    vmovdqu ymm1, [rsp+$00]
                    vpcmpgtd ymm0, ymm0, ymm1
                    vpxor   ymm0, ymm0, [i8.01]
                    vmovdqu yword[rsp+$20], ymm0
                    pop2set
        end_inst
    end if ; </fold>

    if(used inst$i8ve) ; <fold >
        inst i8ve
                    overify TAG_INT8, TAG_INT8
                    vmovdqu ymm0, [rsp+$20]
                    vmovdqu ymm1, [rsp+$00]
                    vpcmpeqd ymm0, ymm0, ymm1
                    vmovdqu yword[rsp+$20], ymm0
                    pop2set
        end_inst
    end if ; </fold>

    if(used inst$i8vne) ; <fold >
        inst i8vne
                    overify TAG_INT8, TAG_INT8
                    vmovdqu ymm0, [rsp+$20]
                    vmovdqu ymm1, [rsp+$00]
                    vpcmpeqd ymm0, ymm0, ymm1
                    vpxor   ymm0, ymm0, [i8.01]
                    vmovdqu yword[rsp+$20], ymm0
                    pop2set
        end_inst
    end if ; </fold>
; </fold>