;
; Исходный код среды исполнения ПВТ-ОО.
;
; Этот исходный код является частью проекта ПВТ-ОО.
;
; Copyright © 2021 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять её и/или
; изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она может быть полезна,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <http://www.gnu.org/licenses/>.
;
; <fold push/pop/peek>
if(used inst$b8push) ; <fold >
inst b8push ; (value in xmm0)
push1
vmovdqa xword[rsp], xmm0
set TAG_BYTE8
end_inst
end if ; </fold>
if(used inst$b8pop) ; <fold >
inst b8pop ; (): value in xmm0
overify TAG_BYTE8
vmovq xmm0, [rsp]
pop1set
end_inst
end if ; </fold>
; </fold>
; <fold conversion>
if(used inst$b8tob) ; <fold >
inst b8tob
overify TAG_BYTE8
movsx eax, byte[rsp]
vmovd xmm0, eax
vmovdqa xword[rsp], xmm0
set TAG_INT
end_inst
end if ; </fold>
if(used inst$b8tob2) ; <fold >
inst b8tob2
overify TAG_BYTE8
vmovdqa xmm0, [rsp]
vpand xmm0, xmm0, [b8.03]
vmovdqa xword[rsp], xmm0
set TAG_BYTE2
end_inst
end if ; </fold>
if(used inst$b8tob4) ; <fold >
inst b8tob4
overify TAG_BYTE8
vmovdqa xmm0, [rsp]
vpand xmm0, xmm0, [b8.02]
vmovdqa xword[rsp], xmm0
set TAG_BYTE4
end_inst
end if ; </fold>
if(used inst$b8tos8) ; <fold >
inst b8tos8
overify TAG_BYTE8
vpmovsxbw xmm0, [rsp]
vmovdqa xword[rsp], xmm0
set TAG_SHORT8
end_inst
end if ; </fold>
if(used inst$b8toi8) ; <fold >
inst b8toi8
overify TAG_BYTE8
push1
vpmovsxbd ymm0, [rsp+$10]
vmovdqu yword[rsp], ymm0
set TAG_INT8
end_inst
end if ; </fold>
if(used inst$b8tol8) ; <fold >
inst b8tol8
overify TAG_BYTE8
push3
vpmovsxbq zmm0, [rsp+$30]
vmovdqu64 zword[rsp], zmm0
set TAG_LONG8
end_inst
end if ; </fold>
; </fold>
; <fold relation>
if(used inst$b8se) ; <fold >
inst b8se
overify TAG_BYTE8, TAG_BYTE8
vpmovsxbd ymm0, [rsp+$10]
vpmovsxbd ymm1, [rsp+$00]
vpcmpeqd ymm0, ymm0, ymm1
vmovmskps eax, ymm0
cmp eax, $ff
sete al
movsx eax, al
vmovd xmm0, eax
vmovdqa xword[rsp+$10], xmm0
pop1set TAG_INT
end_inst
end if ; </fold>
if(used inst$b8sne) ; <fold >
inst b8sne
overify TAG_BYTE8, TAG_BYTE8
vpmovsxbd ymm0, [rsp+$10]
vpmovsxbd ymm1, [rsp+$00]
vpcmpeqd ymm0, ymm0, ymm1
vmovmskps eax, ymm0
cmp eax, $ff
setne al
movsx eax, al
vmovd xmm0, eax
vmovdqa xword[rsp+$10], xmm0
pop1set TAG_INT
end_inst
end if ; </fold>
; </fold>
; <fold bitwise>
if(used inst$b8not) ; <fold >
inst b8not
overify TAG_BYTE8
vmovdqa xmm0, [rsp]
vpxor xmm0, xmm0, [b8.01]
vmovdqa xword[rsp], xmm0
end_inst
end if ; </fold>
if(used inst$b8and) ; <fold >
inst b8and
overify TAG_BYTE8, TAG_BYTE8
vmovdqa xmm0, [rsp+$10]
vpand xmm0, xmm0, [rsp]
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
if(used inst$b8or) ; <fold >
inst b8or
overify TAG_BYTE8, TAG_BYTE8
vmovdqa xmm0, [rsp+$10]
vpor xmm0, xmm0, [rsp]
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
if(used inst$b8xor) ; <fold >
inst b8xor
overify TAG_BYTE8, TAG_BYTE8
vmovdqa xmm0, [rsp+$10]
vpxor xmm0, xmm0, [rsp]
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
; </fold>
; <fold scalar>
if(used inst$b8sneg) ; <fold >
inst b8sneg
overify TAG_BYTE8
push1
vpmovsxbd ymm0, [rsp+$10]
vpxor ymm1, ymm0, ymm0
vpsubd ymm0, ymm1, ymm0
vmovdqu yword[rsp], ymm0
set TAG_INT8
end_inst
end if ; </fold>
if(used inst$b8smul) ; <fold >
inst b8smul
overify TAG_BYTE8, TAG_BYTE8
vpmovsxbd ymm0, [rsp+$10]
vpmovsxbd 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], ymm0
set TAG_INT8
end_inst
end if ; </fold>
if(used inst$b8sadd) ; <fold >
inst b8sadd
overify TAG_BYTE8, TAG_BYTE8
vpmovsxbd ymm0, [rsp+$10]
vpmovsxbd ymm1, [rsp+$00]
vpaddd ymm0, ymm0, ymm1
vmovdqu yword[rsp], ymm0
set TAG_INT8
end_inst
end if ; </fold>
if(used inst$b8ssub) ; <fold >
inst b8ssub
overify TAG_BYTE8, TAG_BYTE8
vpmovsxbd ymm0, [rsp+$10]
vpmovsxbd ymm1, [rsp+$00]
vpsubd ymm0, ymm0, ymm1
vmovdqu yword[rsp], ymm0
set TAG_INT8
end_inst
end if ; </fold>
if(used inst$b8ssar) ; <fold >
inst b8ssar
overify TAG_BYTE8, TAG_INT
mov ecx, [rsp]
and ecx, $1f
vpmovsxbd ymm0, [rsp+$10]
vmovd xmm1, ecx
vpsrad ymm0, ymm0, xmm1
vmovdqu yword[rsp], ymm0
set TAG_INT8
end_inst
end if ; </fold>
if(used inst$b8ssal) ; <fold >
inst b8ssal
overify TAG_BYTE8, TAG_INT
mov ecx, [rsp]
and ecx, $1f
vpmovsxbd ymm0, [rsp+$10]
vmovd xmm1, ecx
vpslld ymm0, ymm0, xmm1
vmovdqu yword[rsp], ymm0
set TAG_INT8
end_inst
end if ; </fold>
if(used inst$b8sshr) ; <fold >
inst b8sshr
overify TAG_BYTE8, TAG_INT
mov ecx, [rsp]
and ecx, $1f
vpmovsxbd ymm0, [rsp+$10]
vmovd xmm1, ecx
vpsrld ymm0, ymm0, xmm1
vmovdqu yword[rsp], ymm0
set TAG_INT8
end_inst
end if ; </fold>
; </fold>
; <fold vector>
if(used inst$b8vunpckl) ; <fold >
inst b8vunpckl
overify TAG_BYTE8
vmovdqa xmm0, [rsp]
vpxor xmm1, xmm0, xmm0
vpunpcklbw xmm0, xmm0, xmm1
vmovdqa xword[rsp], xmm0
set TAG_SHORT8
end_inst
end if ; </fold>
if(used inst$b8vunpcku) ; <fold >
inst b8vunpcku
overify TAG_BYTE8
vmovdqa xmm0, [rsp]
vpxor xmm1, xmm0, xmm0
vpunpcklbw xmm0, xmm1, xmm0
vmovdqa xword[rsp], xmm0
set TAG_SHORT8
end_inst
end if ; </fold>
if(used inst$b8vneg) ; <fold >
inst b8vneg
overify TAG_BYTE8
vpxor xmm0, xmm0, xmm0
vpsubb xmm0, xmm0, [rsp]
vmovdqa xword[rsp], xmm0
end_inst
end if ; </fold>
if(used inst$b8vmul) ; <fold >
inst b8vmul
overify TAG_BYTE8, TAG_BYTE8
vpmovzxbw xmm0, [rsp+$10]
vpmovzxbw xmm1, [rsp+$00]
vpmullw xmm0, xmm0, xmm1
vpand xmm0, xmm0, [s8.00]
vpxor xmm1, xmm0, xmm0
vpackuswb xmm0, xmm0, xmm1
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
if(used inst$b8vadd) ; <fold >
inst b8vadd
overify TAG_BYTE8, TAG_BYTE8
vmovdqa xmm0, [rsp+$10]
vpaddb xmm0, xmm0, [rsp]
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
if(used inst$b8vsub) ; <fold >
inst b8vsub
overify TAG_BYTE8, TAG_BYTE8
vmovdqa xmm0, [rsp+$10]
vpsubb xmm0, xmm0, [rsp]
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
if(used inst$b8vsar) ; <fold >
inst b8vsar
overify TAG_BYTE8, TAG_INT
mov ecx, [rsp]
and ecx, $1f
vpmovsxbw xmm0, [rsp+$10]
vmovd xmm1, ecx
vpsraw xmm0, xmm0, xmm1
vpand xmm0, xmm0, [s8.00]
vpxor xmm1, xmm0, xmm0
vpackuswb xmm0, xmm0, xmm1
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
if(used inst$b8vsal) ; <fold >
inst b8vsal
overify TAG_BYTE8, TAG_INT
mov ecx, [rsp]
and ecx, $1f
vpmovsxbw xmm0, [rsp+$10]
vmovd xmm1, ecx
vpsllw xmm0, xmm0, xmm1
vpand xmm0, xmm0, [s8.00]
vpxor xmm1, xmm0, xmm0
vpackuswb xmm0, xmm0, xmm1
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
if(used inst$b8vshr) ; <fold >
inst b8vshr
overify TAG_BYTE8, TAG_INT
mov ecx, [rsp]
and ecx, $1f
vpmovzxbw xmm0, [rsp+$10]
vmovd xmm1, ecx
vpsrlw xmm0, xmm0, xmm1
vpand xmm0, xmm0, [s8.00]
vpxor xmm1, xmm0, xmm0
vpackuswb xmm0, xmm0, xmm1
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
if(used inst$b8vg) ; <fold >
inst b8vg
overify TAG_BYTE8, TAG_BYTE8
vmovdqa xmm0, [rsp+$10]
vpcmpgtb xmm0, xmm0, [rsp]
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
if(used inst$b8vge) ; <fold >
inst b8vge
overify TAG_BYTE8, TAG_BYTE8
vmovdqa xmm0, [rsp]
vpcmpgtb xmm0, xmm0, [rsp+$10]
vpxor xmm0, xmm0, [b8.01]
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
if(used inst$b8vl) ; <fold >
inst b8vl
overify TAG_BYTE8, TAG_BYTE8
vmovdqa xmm0, [rsp]
vpcmpgtb xmm0, xmm0, [rsp+$10]
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
if(used inst$b8vle) ; <fold >
inst b8vle
overify TAG_BYTE8, TAG_BYTE8
vmovdqa xmm0, [rsp+$10]
vpcmpgtb xmm0, xmm0, [rsp]
vpxor xmm0, xmm0, [b8.01]
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
if(used inst$b8ve) ; <fold >
inst b8ve
overify TAG_BYTE8, TAG_BYTE8
vmovdqa xmm0, [rsp+$10]
vpcmpeqb xmm0, xmm0, [rsp]
vpand xmm0, xmm0, [b8.01]
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
if(used inst$b8vne) ; <fold >
inst b8vne
overify TAG_BYTE8, TAG_BYTE8
vmovdqa xmm0, [rsp+$10]
vpcmpeqb xmm0, xmm0, [rsp]
vpxor xmm0, xmm0, [b8.00]
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
if(used inst$b8vmuls) ; <fold >
inst b8vmuls
overify TAG_BYTE8, TAG_BYTE8
vpmovsxbw xmm0, [rsp+$10]
vpmovsxbw xmm1, [rsp+$00]
vpmullw xmm0, xmm0, xmm1
vpaddw xmm0, xmm0, [s8.05]
vpsraw xmm0, xmm0, $07
vpacksswb xmm0, xmm0, xmm0
vpand xmm0, xmm0, [b8.01]
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
if(used inst$b8vadds) ; <fold >
inst b8vadds
overify TAG_BYTE8, TAG_BYTE8
vmovdqa xmm0, [rsp+$10]
vpaddsb xmm0, xmm0, [rsp]
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
if(used inst$b8vsubs) ; <fold >
inst b8vsubs
overify TAG_BYTE8, TAG_BYTE8
vmovdqa xmm0, [rsp+$10]
vpsubsb xmm0, xmm0, [rsp]
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
if(used inst$b8vmulu) ; <fold >
inst b8vmulu
overify TAG_BYTE8, TAG_BYTE8
vpmovzxbw xmm0, [rsp+$10]
vpmovzxbw xmm1, [rsp+$00]
vpmullw xmm0, xmm0, xmm1
vpaddw xmm0, xmm0, [s8.00]
vpsrlw xmm0, xmm0, $08
vpackuswb xmm0, xmm0, xmm0
vpand xmm0, xmm0, [b8.01]
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
if(used inst$b8vaddu) ; <fold >
inst b8vaddu
overify TAG_BYTE8, TAG_BYTE8
vmovdqa xmm0, [rsp+$10]
vpaddusb xmm0, xmm0, [rsp]
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
if(used inst$b8vsubu) ; <fold >
inst b8vsubu
overify TAG_BYTE8, TAG_BYTE8
vmovdqa xmm0, [rsp+$10]
vpsubusb xmm0, xmm0, [rsp]
vmovdqa xword[rsp+$10], xmm0
pop1set
end_inst
end if ; </fold>
; </fold>