instruction.double8.inc

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

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

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

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

; <fold conversion>
    if(used inst$d8toi8) ; <fold >
        inst d8toi8
                    overify TAG_DOUBLE8
                    vmovdqu64 zmm0, [rsp]
                    vcvttpd2dq ymm1, zmm0
                    vmovdqa64 zmm2, [d8.00]
                    vmovdqa ymm3, [i8.01]
                    vcmppd  k1, zmm2, zmm0, $02
                    vcmppd  k2, zmm0, zmm0, $07
                    vmovdqa32 ymm2{k1}{z}, ymm3
                    vmovdqa32 ymm3{k2}{z}, ymm3
                    vpaddd  ymm0, ymm1, ymm2
                    vpand   ymm0, ymm0, ymm3
                    vmovdqu yword[rsp+$20], ymm0
                    pop2set TAG_INT8
        end_inst
    end if ; </fold>

    if(used inst$d8tol8) ; <fold >
        inst d8tol8
                    overify TAG_DOUBLE8
                    vmovdqu64 zmm0, [rsp]
                    vcvttpd2qq zmm1, zmm0
                    vmovdqa64 zmm2, [d8.01]
                    vmovdqa64 zmm3, [l8.00]
                    vcmppd  k1, zmm2, zmm0, $02
                    vcmppd  k2, zmm0, zmm0, $07
                    vmovdqa64 zmm2{k1}{z}, zmm3
                    vmovdqa64 zmm3{k2}{z}, zmm3
                    vpaddq  zmm0, zmm1, zmm2
                    vpandq  zmm0, zmm0, zmm3
                    vmovdqu64 zword[rsp], zmm0
                    set     TAG_LONG8
        end_inst
    end if ; </fold>

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

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

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

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

; <fold relation>
    if(used inst$d8se) ; <fold >
        inst d8se
                    overify TAG_DOUBLE8, TAG_DOUBLE8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vcmppd  k0, zmm0, zmm1, $00
                    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$d8sne) ; <fold >
        inst d8sne
                    overify TAG_DOUBLE8, TAG_DOUBLE8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vcmppd  k0, zmm0, zmm1, $00
                    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 scalar>
    if(used inst$d8sneg | used inst$d8vneg) ; <fold >
        inst d8sneg, d8vneg
                    overify TAG_DOUBLE8
                    vmovdqu64 zmm0, [rsp]
                    vpxorq  zmm1, zmm0, zmm0
                    vsubpd  zmm0, zmm1, zmm0
                    vmovdqu64 zword[rsp], zmm0
        end_inst
    end if ; </fold>

    if(used inst$d8smul) ; <fold >
        inst d8smul
                    overify TAG_DOUBLE8, TAG_DOUBLE8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vshuff64x2 zmm8, zmm1, zmm1, $e4
                    vshuff64x2 zmm10, zmm8, zmm8, $b1
                    vshuff64x2 zmm12, zmm8, zmm8, $4e
                    vshuff64x2 zmm14, zmm8, zmm8, $1b
                    vshufpd zmm9, zmm8, zmm8, $55
                    vshufpd zmm11, zmm10, zmm10, $55
                    vshufpd zmm13, zmm12, zmm12, $55
                    vshufpd zmm15, zmm14, zmm14, $55
                    vmulpd  zmm8, zmm8, [d8.o0]
                    vmulpd  zmm9, zmm9, [d8.o1]
                    vmulpd  zmm10, zmm10, [d8.o2]
                    vmulpd  zmm11, zmm11, [d8.o3]
                    vmulpd  zmm12, zmm12, [d8.o4]
                    vmulpd  zmm13, zmm13, [d8.o5]
                    vmulpd  zmm14, zmm14, [d8.o6]
                    vmulpd  zmm15, zmm15, [d8.o7]
                    vmulpd  zmm7, zmm0, zmm15, {rn-sae}
                    vmulpd  zmm6, zmm0, zmm14, {rn-sae}
                    vmulpd  zmm5, zmm0, zmm13, {rn-sae}
                    vmulpd  zmm4, zmm0, zmm12, {rn-sae}
                    vmulpd  zmm3, zmm0, zmm11, {rn-sae}
                    vmulpd  zmm2, zmm0, zmm10, {rn-sae}
                    vmulpd  zmm1, zmm0, zmm9, {rn-sae}
                    vmulpd  zmm0, zmm0, zmm8, {rn-sae}
                    vextractf64x4 ymm8, zmm0, $01
                    vextractf64x4 ymm9, zmm1, $01
                    vextractf64x4 ymm10, zmm2, $01
                    vextractf64x4 ymm11, zmm3, $01
                    vextractf64x4 ymm12, zmm4, $01
                    vextractf64x4 ymm13, zmm5, $01
                    vextractf64x4 ymm14, zmm6, $01
                    vextractf64x4 ymm15, zmm7, $01
                    vinsertf64x4 zmm0, zmm0, ymm2, $01
                    vinsertf64x4 zmm2, zmm4, ymm6, $01
                    vinsertf64x4 zmm4, zmm1, ymm3, $01
                    vinsertf64x4 zmm6, zmm5, ymm7, $01
                    vinsertf64x4 zmm1, zmm8, ymm10, $01
                    vinsertf64x4 zmm3, zmm12, ymm14, $01
                    vinsertf64x4 zmm5, zmm9, ymm11, $01
                    vinsertf64x4 zmm7, zmm13, ymm15, $01
                    vaddpd  zmm0, zmm0, zmm1
                    vaddpd  zmm1, zmm2, zmm3
                    vaddpd  zmm2, zmm4, zmm5
                    vaddpd  zmm3, zmm6, zmm7
                    vshuff64x2 zmm4, zmm0, zmm1, $88
                    vshuff64x2 zmm5, zmm0, zmm1, $dd
                    vshuff64x2 zmm6, zmm2, zmm3, $88
                    vshuff64x2 zmm7, zmm2, zmm3, $dd
                    vaddpd  zmm0, zmm4, zmm5
                    vaddpd  zmm1, zmm6, zmm7
                    vshufpd zmm2, zmm0, zmm1, $00
                    vshufpd zmm3, zmm0, zmm1, $ff
                    vaddpd  zmm0, zmm2, zmm3
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set
        end_inst
    end if ; </fold>

    if(used inst$d8sdiv) ; <fold >
        inst d8sdiv
                    overify TAG_DOUBLE8, TAG_DOUBLE8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vmulpd  zmm1, zmm1, [d8.o0]
                    vmulpd  zmm2, zmm1, zmm1, {rn-sae}
                    vextractf64x2 xmm3, zmm2, $01
                    vextractf64x2 xmm4, zmm2, $02
                    vextractf64x2 xmm5, zmm2, $03
                    vhaddpd xmm2, xmm2, xmm3
                    vhaddpd xmm3, xmm4, xmm5
                    vhaddpd xmm2, xmm2, xmm3
                    vhaddpd xmm2, xmm2, xmm2
                    vbroadcastsd zmm2, xmm2
                    vdivpd  zmm1, zmm1, zmm2
                    vshuff64x2 zmm8, zmm1, zmm1, $e4
                    vshuff64x2 zmm10, zmm8, zmm8, $b1
                    vshuff64x2 zmm12, zmm8, zmm8, $4e
                    vshuff64x2 zmm14, zmm8, zmm8, $1b
                    vshufpd zmm9, zmm8, zmm8, $55
                    vshufpd zmm11, zmm10, zmm10, $55
                    vshufpd zmm13, zmm12, zmm12, $55
                    vshufpd zmm15, zmm14, zmm14, $55
                    vmulpd  zmm8, zmm8, [d8.o0]
                    vmulpd  zmm9, zmm9, [d8.o1]
                    vmulpd  zmm10, zmm10, [d8.o2]
                    vmulpd  zmm11, zmm11, [d8.o3]
                    vmulpd  zmm12, zmm12, [d8.o4]
                    vmulpd  zmm13, zmm13, [d8.o5]
                    vmulpd  zmm14, zmm14, [d8.o6]
                    vmulpd  zmm15, zmm15, [d8.o7]
                    vmulpd  zmm7, zmm0, zmm15, {rn-sae}
                    vmulpd  zmm6, zmm0, zmm14, {rn-sae}
                    vmulpd  zmm5, zmm0, zmm13, {rn-sae}
                    vmulpd  zmm4, zmm0, zmm12, {rn-sae}
                    vmulpd  zmm3, zmm0, zmm11, {rn-sae}
                    vmulpd  zmm2, zmm0, zmm10, {rn-sae}
                    vmulpd  zmm1, zmm0, zmm9, {rn-sae}
                    vmulpd  zmm0, zmm0, zmm8, {rn-sae}
                    vextractf64x4 ymm8, zmm0, $01
                    vextractf64x4 ymm9, zmm1, $01
                    vextractf64x4 ymm10, zmm2, $01
                    vextractf64x4 ymm11, zmm3, $01
                    vextractf64x4 ymm12, zmm4, $01
                    vextractf64x4 ymm13, zmm5, $01
                    vextractf64x4 ymm14, zmm6, $01
                    vextractf64x4 ymm15, zmm7, $01
                    vinsertf64x4 zmm0, zmm0, ymm2, $01
                    vinsertf64x4 zmm2, zmm4, ymm6, $01
                    vinsertf64x4 zmm4, zmm1, ymm3, $01
                    vinsertf64x4 zmm6, zmm5, ymm7, $01
                    vinsertf64x4 zmm1, zmm8, ymm10, $01
                    vinsertf64x4 zmm3, zmm12, ymm14, $01
                    vinsertf64x4 zmm5, zmm9, ymm11, $01
                    vinsertf64x4 zmm7, zmm13, ymm15, $01
                    vaddpd  zmm0, zmm0, zmm1
                    vaddpd  zmm1, zmm2, zmm3
                    vaddpd  zmm2, zmm4, zmm5
                    vaddpd  zmm3, zmm6, zmm7
                    vshuff64x2 zmm4, zmm0, zmm1, $88
                    vshuff64x2 zmm5, zmm0, zmm1, $dd
                    vshuff64x2 zmm6, zmm2, zmm3, $88
                    vshuff64x2 zmm7, zmm2, zmm3, $dd
                    vaddpd  zmm0, zmm4, zmm5
                    vaddpd  zmm1, zmm6, zmm7
                    vshufpd zmm2, zmm0, zmm1, $00
                    vshufpd zmm3, zmm0, zmm1, $ff
                    vaddpd  zmm0, zmm2, zmm3
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set
        end_inst
    end if ; </fold>

    if(used inst$d8sdivu) ; <fold >
        inst d8sdivu
                    overify TAG_DOUBLE8, TAG_DOUBLE8
                    vmovdqu64 zmm0, [rsp+$00]
                    vmovdqu64 zmm1, [rsp+$40]
                    vmulpd  zmm0, zmm0, [d8.o0]
                    vmulpd  zmm2, zmm0, zmm0, {rn-sae}
                    vextractf64x2 xmm3, zmm2, $01
                    vextractf64x2 xmm4, zmm2, $02
                    vextractf64x2 xmm5, zmm2, $03
                    vhaddpd xmm2, xmm2, xmm3
                    vhaddpd xmm3, xmm4, xmm5
                    vhaddpd xmm2, xmm2, xmm3
                    vhaddpd xmm2, xmm2, xmm2
                    vbroadcastsd zmm2, xmm2
                    vdivpd  zmm0, zmm0, zmm2
                    vshuff64x2 zmm8, zmm1, zmm1, $e4
                    vshuff64x2 zmm10, zmm8, zmm8, $b1
                    vshuff64x2 zmm12, zmm8, zmm8, $4e
                    vshuff64x2 zmm14, zmm8, zmm8, $1b
                    vshufpd zmm9, zmm8, zmm8, $55
                    vshufpd zmm11, zmm10, zmm10, $55
                    vshufpd zmm13, zmm12, zmm12, $55
                    vshufpd zmm15, zmm14, zmm14, $55
                    vmulpd  zmm8, zmm8, [d8.o0]
                    vmulpd  zmm9, zmm9, [d8.o1]
                    vmulpd  zmm10, zmm10, [d8.o2]
                    vmulpd  zmm11, zmm11, [d8.o3]
                    vmulpd  zmm12, zmm12, [d8.o4]
                    vmulpd  zmm13, zmm13, [d8.o5]
                    vmulpd  zmm14, zmm14, [d8.o6]
                    vmulpd  zmm15, zmm15, [d8.o7]
                    vmulpd  zmm7, zmm0, zmm15, {rn-sae}
                    vmulpd  zmm6, zmm0, zmm14, {rn-sae}
                    vmulpd  zmm5, zmm0, zmm13, {rn-sae}
                    vmulpd  zmm4, zmm0, zmm12, {rn-sae}
                    vmulpd  zmm3, zmm0, zmm11, {rn-sae}
                    vmulpd  zmm2, zmm0, zmm10, {rn-sae}
                    vmulpd  zmm1, zmm0, zmm9, {rn-sae}
                    vmulpd  zmm0, zmm0, zmm8, {rn-sae}
                    vextractf64x4 ymm8, zmm0, $01
                    vextractf64x4 ymm9, zmm1, $01
                    vextractf64x4 ymm10, zmm2, $01
                    vextractf64x4 ymm11, zmm3, $01
                    vextractf64x4 ymm12, zmm4, $01
                    vextractf64x4 ymm13, zmm5, $01
                    vextractf64x4 ymm14, zmm6, $01
                    vextractf64x4 ymm15, zmm7, $01
                    vinsertf64x4 zmm0, zmm0, ymm2, $01
                    vinsertf64x4 zmm2, zmm4, ymm6, $01
                    vinsertf64x4 zmm4, zmm1, ymm3, $01
                    vinsertf64x4 zmm6, zmm5, ymm7, $01
                    vinsertf64x4 zmm1, zmm8, ymm10, $01
                    vinsertf64x4 zmm3, zmm12, ymm14, $01
                    vinsertf64x4 zmm5, zmm9, ymm11, $01
                    vinsertf64x4 zmm7, zmm13, ymm15, $01
                    vaddpd  zmm0, zmm0, zmm1
                    vaddpd  zmm1, zmm2, zmm3
                    vaddpd  zmm2, zmm4, zmm5
                    vaddpd  zmm3, zmm6, zmm7
                    vshuff64x2 zmm4, zmm0, zmm1, $88
                    vshuff64x2 zmm5, zmm0, zmm1, $dd
                    vshuff64x2 zmm6, zmm2, zmm3, $88
                    vshuff64x2 zmm7, zmm2, zmm3, $dd
                    vaddpd  zmm0, zmm4, zmm5
                    vaddpd  zmm1, zmm6, zmm7
                    vshufpd zmm2, zmm0, zmm1, $00
                    vshufpd zmm3, zmm0, zmm1, $ff
                    vaddpd  zmm0, zmm2, zmm3
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set
        end_inst
    end if ; </fold>

    if(used inst$d8sadd | used inst$d8vadd) ; <fold >
        inst d8sadd, d8vadd
                    overify TAG_DOUBLE8, TAG_DOUBLE8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vaddpd  zmm0, zmm0, zmm1
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set
        end_inst
    end if ; </fold>

    if(used inst$d8ssub | used inst$d8vsub) ; <fold >
        inst d8ssub, d8vsub
                    overify TAG_DOUBLE8, TAG_DOUBLE8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vsubpd  zmm0, zmm0, zmm1
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set
        end_inst
    end if ; </fold>
; </fold>

; <fold vector>
    if(used inst$d8vmul) ; <fold >
        inst d8vmul
                    overify TAG_DOUBLE8, TAG_DOUBLE8
                    vmovdqu64 zmm0, [rsp+$40]
                    vmovdqu64 zmm1, [rsp+$00]
                    vmulpd  zmm0, zmm0, zmm1
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set
        end_inst
    end if ; </fold>

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

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

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

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

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

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

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