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