instruction.newvector.inc

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

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

; <fold construct vector>
    if(used inst$newvectori2) ; <fold >
        inst newvectori2
                    overify TAG_INT, TAG_INT
                    mov     eax, [rsp+$00]
                    mov     dword[rsp+$14], eax
                    pop1set TAG_INT2
        end_inst
    end if ; </fold>

    if(used inst$newvectori4) ; <fold >
        inst newvectori4
                    overify TAG_INT, TAG_INT, TAG_INT, TAG_INT
                    vmovdqa xmm1, [i4.00]
                    vpcmpeqd xmm2, xmm0, xmm0
                    vpgatherdd xmm0, [rsp+xmm1*1], xmm2
                    vmovdqa xword[rsp+$30], xmm0
                    pop3set TAG_INT4
        end_inst
    end if ; </fold>

    if(used inst$newvectori8) ; <fold >
        inst newvectori8
                    overify TAG_INT, TAG_INT, TAG_INT, TAG_INT, TAG_INT, TAG_INT, TAG_INT, TAG_INT
                    vmovdqa ymm1, [i8.00]
                    vpcmpeqd ymm2, ymm0, ymm0
                    vpgatherdd ymm0, [rsp+ymm1*1], ymm2
                    vmovdqu yword[rsp+$60], ymm0
                    pop6set TAG_INT8
        end_inst
    end if ; </fold>

    if(used inst$newvectorl2) ; <fold >
        inst newvectorl2
                    overify TAG_LONG, TAG_LONG
                    mov     rax, [rsp+$00]
                    mov     qword[rsp+$18], rax
                    pop1set TAG_LONG2
        end_inst
    end if ; </fold>

    if(used inst$newvectorl4) ; <fold >
        inst newvectorl4
                    overify TAG_LONG, TAG_LONG, TAG_LONG, TAG_LONG
                    vmovdqa xmm1, [i4.00]
                    vpcmpeqq ymm2, ymm0, ymm0
                    vpgatherdq ymm0, [rsp+xmm1*1], ymm2
                    vmovdqu yword[rsp+$20], ymm0
                    pop2set TAG_LONG4
        end_inst
    end if ; </fold>

    if(used inst$newvectorl8) ; <fold >
        inst newvectorl8
                    overify TAG_LONG, TAG_LONG, TAG_LONG, TAG_LONG, TAG_LONG, TAG_LONG, TAG_LONG, TAG_LONG
                    vmovdqa ymm1, [i8.00]
                    vpcmpeqq k1, zmm0, zmm0
                    vpgatherdq zmm0{k1}, [rsp+ymm1*1]
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set TAG_LONG8
        end_inst
    end if ; </fold>

    if(used inst$newvectorf2) ; <fold >
        inst newvectorf2
                    overify TAG_FLOAT, TAG_FLOAT
                    vmovd   xmm0, [rsp+$00]
                    vmovd   dword[rsp+$14], xmm0
                    pop1set TAG_FLOAT2
        end_inst
    end if ; </fold>

    if(used inst$newvectorf4) ; <fold >
        inst newvectorf4
                    overify TAG_FLOAT, TAG_FLOAT, TAG_FLOAT, TAG_FLOAT
                    vmovdqa xmm1, [i4.00]
                    vpcmpeqd xmm2, xmm0, xmm0
                    vgatherdps xmm0, [rsp+xmm1*1], xmm2
                    vmovdqa xword[rsp+$30], xmm0
                    pop3set TAG_FLOAT4
        end_inst
    end if ; </fold>

    if(used inst$newvectorf8) ; <fold >
        inst newvectorf8
                    overify TAG_FLOAT, TAG_FLOAT, TAG_FLOAT, TAG_FLOAT, TAG_FLOAT, TAG_FLOAT, TAG_FLOAT, TAG_FLOAT
                    vmovdqa ymm1, [i8.00]
                    vpcmpeqd ymm2, ymm0, ymm0
                    vgatherdps ymm0, [rsp+ymm1*1], ymm2
                    vmovdqu yword[rsp+$60], ymm0
                    pop6set TAG_FLOAT8
        end_inst
    end if ; </fold>

    if(used inst$newvectord2) ; <fold >
        inst newvectord2
                    overify TAG_DOUBLE, TAG_DOUBLE
                    vmovq   xmm0, [rsp+$00]
                    vmovq   qword[rsp+$18], xmm0
                    pop1set TAG_DOUBLE2
        end_inst
    end if ; </fold>

    if(used inst$newvectord4) ; <fold >
        inst newvectord4
                    overify TAG_DOUBLE, TAG_DOUBLE, TAG_DOUBLE, TAG_DOUBLE
                    vmovdqa xmm1, [i4.00]
                    vpcmpeqq ymm2, ymm0, ymm0
                    vgatherdpd ymm0, [rsp+xmm1*1], ymm2
                    vmovdqu yword[rsp+$20], ymm0
                    pop2set TAG_DOUBLE4
        end_inst
    end if ; </fold>

    if(used inst$newvectord8) ; <fold >
        inst newvectord8
                    overify TAG_DOUBLE, TAG_DOUBLE, TAG_DOUBLE, TAG_DOUBLE, TAG_DOUBLE, TAG_DOUBLE, TAG_DOUBLE, TAG_DOUBLE
                    vmovdqa ymm1, [i8.00]
                    vpcmpeqq k1, zmm0, zmm0
                    vgatherdpd zmm0{k1}, [rsp+ymm1*1]
                    vmovdqu64 zword[rsp+$40], zmm0
                    pop4set TAG_DOUBLE8
        end_inst
    end if ; </fold>

    if(used inst$newvectorb2) ; <fold >
        inst newvectorb2
                    overify TAG_INT, TAG_INT
                    mov     al, [rsp+$00]
                    mov     word[rsp+$12], $00
                    mov     byte[rsp+$11], al
                    pop1set TAG_BYTE2
        end_inst
    end if ; </fold>

    if(used inst$newvectorb4) ; <fold >
        inst newvectorb4
                    overify TAG_INT, TAG_INT, TAG_INT, TAG_INT
                    mov     al, [rsp+$20]
                    mov     cl, [rsp+$10]
                    mov     dl, [rsp+$00]
                    mov     byte[rsp+$31], al
                    mov     byte[rsp+$32], cl
                    mov     byte[rsp+$33], dl
                    pop3set TAG_BYTE4
        end_inst
    end if ; </fold>

    if(used inst$newvectorb8) ; <fold >
        inst newvectorb8
                    overify TAG_INT, TAG_INT, TAG_INT, TAG_INT, TAG_INT, TAG_INT, TAG_INT, TAG_INT
                    mov     al, [rsp+$60]
                    mov     cl, [rsp+$50]
                    mov     dl, [rsp+$40]
                    mov     byte[rsp+$71], al
                    mov     byte[rsp+$72], cl
                    mov     byte[rsp+$73], dl
                    mov     dil, [rsp+$30]
                    mov     al, [rsp+$20]
                    mov     cl, [rsp+$10]
                    mov     dl, [rsp+$00]
                    mov     byte[rsp+$74], dil
                    mov     byte[rsp+$75], al
                    mov     byte[rsp+$76], cl
                    mov     byte[rsp+$77], dl
                    pop7set TAG_BYTE8
        end_inst
    end if ; </fold>

    if(used inst$newvectors2) ; <fold >
        inst newvectors2
                    overify TAG_INT, TAG_INT
                    mov     ax, [rsp+$00]
                    mov     word[rsp+$12], ax
                    pop1set TAG_SHORT2
        end_inst
    end if ; </fold>

    if(used inst$newvectors4) ; <fold >
        inst newvectors4
                    overify TAG_INT, TAG_INT, TAG_INT, TAG_INT
                    mov     ax, [rsp+$20]
                    mov     cx, [rsp+$10]
                    mov     dx, [rsp+$00]
                    mov     word[rsp+$32], ax
                    mov     word[rsp+$34], cx
                    mov     word[rsp+$36], dx
                    pop3set TAG_SHORT4
        end_inst
    end if ; </fold>

    if(used inst$newvectors8) ; <fold >
        inst newvectors8
                    overify TAG_INT, TAG_INT, TAG_INT, TAG_INT, TAG_INT, TAG_INT, TAG_INT, TAG_INT
                    mov     ax, [rsp+$60]
                    mov     cx, [rsp+$50]
                    mov     dx, [rsp+$40]
                    mov     word[rsp+$72], ax
                    mov     word[rsp+$74], cx
                    mov     word[rsp+$76], dx
                    mov     di, [rsp+$30]
                    mov     ax, [rsp+$20]
                    mov     cx, [rsp+$10]
                    mov     dx, [rsp+$00]
                    mov     word[rsp+$78], di
                    mov     word[rsp+$7a], ax
                    mov     word[rsp+$7c], cx
                    mov     word[rsp+$7e], dx
                    pop7set TAG_SHORT8
        end_inst
    end if ; </fold>
; </fold>