instruction.long8.inc

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

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

; <fold push/pop/peek>
    if(used inst$l8push) ; <fold >
        inst l8push ; (value in zmm0)
                    push4
                    vmovdqu64 zword[rsp], zmm0
                    set     TAG_LONG8
        end_inst
    end if ; </fold>

    if(used inst$l8pop) ; <fold >
        inst l8pop ; (): value in zmm0
                    overify TAG_LONG8
                    vmovdqu64 zmm0, [rsp]
                    pop4set
        end_inst
    end if ; </fold>
; </fold>

; <fold conversion>
    if(used inst$l8tob8) ; <fold >
        inst l8tob8
                    overify TAG_LONG8
                    vmovdqu64 zmm0, [rsp]
                    vpandq  zmm0, zmm0, [l8.03]
                    vshufps zmm0, zmm0, zmm0, $d8
                    vshufi64x2 zmm0, zmm0, zmm0, $d8
                    vextracti64x4 ymm1, zmm0, $01
                    vpslldq ymm1, ymm1, $08
                    vpor    ymm0, ymm0, ymm1
                    vextracti128 xmm1, ymm0, $01
                    vpackusdw xmm0, xmm0, xmm1
                    vpxor   xmm1, xmm0, xmm0
                    vpackuswb xmm0, xmm0, xmm1
                    vmovdqa xword[rsp+$30], xmm0
                    pop3set TAG_BYTE8
        end_inst
    end if ; </fold>

    if(used inst$l8tos8) ; <fold >
        inst l8tos8
                    overify TAG_LONG8
                    vmovdqu64 zmm0, [rsp]
                    vpandq  zmm0, zmm0, [l8.02]
                    vshufps zmm0, zmm0, zmm0, $d8
                    vshufi64x2 zmm0, zmm0, zmm0, $d8
                    vextracti64x4 ymm1, zmm0, $01
                    vpslldq ymm1, ymm1, $08
                    vpor    ymm0, ymm0, ymm1
                    vextracti128 xmm1, ymm0, $01
                    vpackusdw xmm0, xmm0, xmm1
                    vmovdqa xword[rsp+$30], xmm0
                    pop3set TAG_SHORT8
        end_inst
    end if ; </fold>

    if(used inst$l8toi8) ; <fold >
        inst l8toi8
                    overify TAG_LONG8
                    vmovdqu64 zmm0, [rsp]
                    vpandq  zmm0, zmm0, [l8.01]
                    vshufps zmm0, zmm0, zmm0, $d8
                    vshufi64x2 zmm0, zmm0, zmm0, $d8
                    vextracti64x4 ymm1, zmm0, $01
                    vpslldq ymm1, ymm1, $08
                    vpor    ymm0, ymm0, ymm1
                    vmovdqu yword[rsp+$20], ymm0
                    pop2set TAG_INT8
        end_inst
    end if ; </fold>

    if(used inst$l8tol) ; <fold >
        inst l8tol
                    overify TAG_LONG8
                    vmovq   xmm0, [rsp]
                    vmovdqa xword[rsp+$30], xmm0
                    pop3set TAG_LONG
        end_inst
    end if ; </fold>

    if(used inst$l8tol2) ; <fold >
        inst l8tol2
                    overify TAG_LONG8
                    vmovdqa xmm0, [rsp]
                    vmovdqa xword[rsp+$30], xmm0
                    pop3set TAG_LONG2
        end_inst
    end if ; </fold>

    if(used inst$l8tol4) ; <fold >
        inst l8tol4
                    overify TAG_LONG8
                    vmovdqu ymm0, [rsp]
                    vmovdqu yword[rsp+$20], ymm0
                    pop2set TAG_LONG4
        end_inst
    end if ; </fold>

    if(used inst$l8tof8) ; <fold >
        inst l8tof8
                    overify TAG_LONG8
                    vmovdqu64 zmm0, [rsp]
                    vcvtqq2ps ymm0, zmm0
                    vmovdqu yword[rsp+$20], ymm0
                    pop2set TAG_FLOAT8
        end_inst
    end if ; </fold>

    if(used inst$l8tod8) ; <fold >
        inst l8tod8
                    overify TAG_LONG8
                    vmovdqu64 zmm0, [rsp]
                    vcvtqq2pd zmm0, zmm0
                    vmovdqu64 zword[rsp], zmm0
                    set     TAG_DOUBLE8
        end_inst
    end if ; </fold>
; </fold>

; <fold relation>
    if(used inst$l8se) ; <fold >
        inst l8se
                    overify TAG_LONG8, TAG_LONG8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vpcmpeqq k0, zmm0, zmm1
                    kmovw   eax, k0
                    cmp     eax, $ff
                    sete    al
                    movsx   eax, al
                    vmovd   xmm0, eax
                    vmovdqa xword[rsp+$70], xmm0
                    pop7set TAG_INT
        end_inst
    end if ; </fold>

    if(used inst$l8sne) ; <fold >
        inst l8sne
                    overify TAG_LONG8, TAG_LONG8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vpcmpeqq k0, zmm0, zmm1
                    kmovw   eax, k0
                    cmp     eax, $ff
                    setne   al
                    movsx   eax, al
                    vmovd   xmm0, eax
                    vmovdqa xword[rsp+$70], xmm0
                    pop7set TAG_INT
        end_inst
    end if ; </fold>
; </fold>

; <fold bitwise>
    if(used inst$l8not) ; <fold >
        inst l8not
                    overify TAG_LONG8
                    vmovdqu64 zmm0, [rsp]
                    vpxorq  zmm0, zmm0, [l8.00]
                    vmovdqu64 zword[rsp], zmm0
        end_inst
    end if ; </fold>

    if(used inst$l8and) ; <fold >
        inst l8and
                    overify TAG_LONG8, TAG_LONG8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vpandq  zmm0, zmm0, zmm1
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set
        end_inst
    end if ; </fold>

    if(used inst$l8or) ; <fold >
        inst l8or
                    overify TAG_LONG8, TAG_LONG8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vporq   zmm0, zmm0, zmm1
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set
        end_inst
    end if ; </fold>

    if(used inst$l8xor) ; <fold >
        inst l8xor
                    overify TAG_LONG8, TAG_LONG8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vpxorq  zmm0, zmm0, zmm1
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set
        end_inst
    end if ; </fold>
; </fold>

; <fold scalar>
    if(used inst$l8sneg | used inst$l8vneg) ; <fold >
        inst l8sneg, l8vneg
                    overify TAG_LONG8
                    vmovdqu64 zmm0, [rsp]
                    vpxorq  zmm1, zmm0, zmm0
                    vpsubq  zmm0, zmm1, zmm0
                    vmovdqu64 zword[rsp], zmm0
        end_inst
    end if ; </fold>

    if(used inst$l8smul) ; <fold >
        inst l8smul
                    overify TAG_LONG8, TAG_LONG8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vshufi64x2 zmm8, zmm1, zmm1, $e4
                    vshufi64x2 zmm10, zmm8, zmm8, $b1
                    vshufi64x2 zmm12, zmm8, zmm8, $4e
                    vshufi64x2 zmm14, zmm8, zmm8, $1b
                    vshufpd zmm9, zmm8, zmm8, $55
                    vshufpd zmm11, zmm10, zmm10, $55
                    vshufpd zmm13, zmm12, zmm12, $55
                    vshufpd zmm15, zmm14, zmm14, $55
                    vpmullq zmm8, zmm8, [l8.o0]
                    vpmullq zmm9, zmm9, [l8.o1]
                    vpmullq zmm10, zmm10, [l8.o2]
                    vpmullq zmm11, zmm11, [l8.o3]
                    vpmullq zmm12, zmm12, [l8.o4]
                    vpmullq zmm13, zmm13, [l8.o5]
                    vpmullq zmm14, zmm14, [l8.o6]
                    vpmullq zmm15, zmm15, [l8.o7]
                    vpmullq zmm7, zmm0, zmm15
                    vpmullq zmm6, zmm0, zmm14
                    vpmullq zmm5, zmm0, zmm13
                    vpmullq zmm4, zmm0, zmm12
                    vpmullq zmm3, zmm0, zmm11
                    vpmullq zmm2, zmm0, zmm10
                    vpmullq zmm1, zmm0, zmm9
                    vpmullq zmm0, zmm0, zmm8
                    vextracti64x4 ymm8, zmm0, $01
                    vextracti64x4 ymm9, zmm1, $01
                    vextracti64x4 ymm10, zmm2, $01
                    vextracti64x4 ymm11, zmm3, $01
                    vextracti64x4 ymm12, zmm4, $01
                    vextracti64x4 ymm13, zmm5, $01
                    vextracti64x4 ymm14, zmm6, $01
                    vextracti64x4 ymm15, zmm7, $01
                    vinserti64x4 zmm0, zmm0, ymm2, $01
                    vinserti64x4 zmm2, zmm4, ymm6, $01
                    vinserti64x4 zmm4, zmm1, ymm3, $01
                    vinserti64x4 zmm6, zmm5, ymm7, $01
                    vinserti64x4 zmm1, zmm8, ymm10, $01
                    vinserti64x4 zmm3, zmm12, ymm14, $01
                    vinserti64x4 zmm5, zmm9, ymm11, $01
                    vinserti64x4 zmm7, zmm13, ymm15, $01
                    vpaddq  zmm0, zmm0, zmm1
                    vpaddq  zmm1, zmm2, zmm3
                    vpaddq  zmm2, zmm4, zmm5
                    vpaddq  zmm3, zmm6, zmm7
                    vshufi64x2 zmm4, zmm0, zmm1, $88
                    vshufi64x2 zmm5, zmm0, zmm1, $dd
                    vshufi64x2 zmm6, zmm2, zmm3, $88
                    vshufi64x2 zmm7, zmm2, zmm3, $dd
                    vpaddq  zmm0, zmm4, zmm5
                    vpaddq  zmm1, zmm6, zmm7
                    vshufpd zmm2, zmm0, zmm1, $00
                    vshufpd zmm3, zmm0, zmm1, $ff
                    vpaddq  zmm0, zmm2, zmm3
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set
        end_inst
    end if ; </fold>

    if(used inst$l8sadd | used inst$l8vadd) ; <fold >
        inst l8sadd, l8vadd
                    overify TAG_LONG8, TAG_LONG8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vpaddq  zmm0, zmm0, zmm1
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set
        end_inst
    end if ; </fold>

    if(used inst$l8ssub | used inst$l8vsub) ; <fold >
        inst l8ssub, l8vsub
                    overify TAG_LONG8, TAG_LONG8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vpsubq  zmm0, zmm0, zmm1
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set
        end_inst
    end if ; </fold>

    if(used inst$l8ssar | used inst$l8vsar) ; <fold >
        inst l8ssar, l8vsar
                    overify TAG_LONG8, TAG_INT
                    mov     ecx, [rsp]
                    and     ecx, $3f
                    vmovdqu64 zmm0, [rsp+$10]
                    vmovd   xmm1, ecx
                    vpsraq  zmm0, zmm0, xmm1
                    vmovdqu64 zword[rsp+$10], zmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$l8ssal | used inst$l8vsal) ; <fold >
        inst l8ssal, l8vsal
                    overify TAG_LONG8, TAG_INT
                    mov     ecx, [rsp]
                    and     ecx, $3f
                    vmovdqu64 zmm0, [rsp+$10]
                    vmovd   xmm1, ecx
                    vpsllq  zmm0, zmm0, xmm1
                    vmovdqu64 zword[rsp+$10], zmm0
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$l8sshr | used inst$l8vshr) ; <fold >
        inst l8sshr, l8vshr
                    overify TAG_LONG8, TAG_INT
                    mov     ecx, [rsp]
                    and     ecx, $3f
                    vmovdqu64 zmm0, [rsp+$10]
                    vmovd   xmm1, ecx
                    vpsrlq  zmm0, zmm0, xmm1
                    vmovdqu64 zword[rsp+$10], zmm0
                    pop1set
        end_inst
    end if ; </fold>
; </fold>

; <fold vector>
    if(used inst$l8vpack) ; <fold >
        inst l8vpack
                    overify TAG_LONG8
                    vmovdqu64 zmm0, [rsp]
                    vpxorq  zmm1, zmm0, zmm0
                    vpcmpgtq k1, zmm1, zmm0
                    vpcmpgtq k2, zmm0, [l8.01]
                    vmovdqa64 zmm2, [l8.00]
                    vmovdqa64 zmm1{k1}{z}, zmm2
                    vmovdqa64 zmm2{k2}{z}, zmm2
                    vpandnq zmm0, zmm1, zmm0
                    vporq   zmm0, zmm2, zmm0
                    vshufps zmm0, zmm0, zmm0, $d8
                    vshufi64x2 zmm0, zmm0, zmm0, $d8
                    vextracti64x4 ymm1, zmm0, $01
                    vpand   ymm0, ymm0, [i8.04]
                    vpslldq ymm1, ymm1, $08
                    vpor    ymm0, ymm0, ymm1
                    vmovdqu yword[rsp+$20], ymm0
                    pop2set TAG_INT8
        end_inst
    end if ; </fold>

    if(used inst$l8vmul) ; <fold >
        inst l8vmul
                    overify TAG_LONG8, TAG_LONG8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vpmullq zmm0, zmm0, zmm1
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set
        end_inst
    end if ; </fold>

    if(used inst$l8vg) ; <fold >
        inst l8vg
                    overify TAG_LONG8, TAG_LONG8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vpcmpgtq k1, zmm0, zmm1
                    vmovdqa64 zmm0{k1}{z}, [l8.00]
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set
        end_inst
    end if ; </fold>

    if(used inst$l8vge) ; <fold >
        inst l8vge
                    overify TAG_LONG8, TAG_LONG8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vpcmpgtq k1, zmm1, zmm0
                    knotw   k1, k1
                    vmovdqa64 zmm0{k1}{z}, [l8.00]
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set
        end_inst
    end if ; </fold>

    if(used inst$l8vl) ; <fold >
        inst l8vl
                    overify TAG_LONG8, TAG_LONG8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vpcmpgtq k1, zmm1, zmm0
                    vmovdqa64 zmm0{k1}{z}, [l8.00]
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set
        end_inst
    end if ; </fold>

    if(used inst$l8vle) ; <fold >
        inst l8vle
                    overify TAG_LONG8, TAG_LONG8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vpcmpgtq k1, zmm0, zmm1
                    knotw   k1, k1
                    vmovdqa64 zmm0{k1}{z}, [l8.00]
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set
        end_inst
    end if ; </fold>

    if(used inst$l8ve) ; <fold >
        inst l8ve
                    overify TAG_LONG8, TAG_LONG8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vpcmpeqq k1, zmm0, zmm1
                    vmovdqa64 zmm0{k1}{z}, [l8.00]
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set
        end_inst
    end if ; </fold>

    if(used inst$l8vne) ; <fold >
        inst l8vne
                    overify TAG_LONG8, TAG_LONG8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vpcmpeqq k1, zmm0, zmm1
                    knotw   k1, k1
                    vmovdqa64 zmm0{k1}{z}, [l8.00]
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set
        end_inst
    end if ; </fold>
; </fold>