;
; Исходный код среды исполнения ПВТ-ОО.
;
; Этот исходный код является частью проекта ПВТ-ОО.
;
; 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>