;
; Исходный код среды исполнения ПВТ-ОО.
;
; Этот исходный код является частью проекта ПВТ-ОО.
;
; Copyright © 2021 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять её и/или
; изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она может быть полезна,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <http://www.gnu.org/licenses/>.
;
; <fold push/pop/peek>
if(used inst$l8push) ; <fold >
inst l8push ; (value in zmm0)
push4
vmovdqu64 zword[rsp], zmm0
set TAG_LONG8
end_inst
end if ; </fold>
if(used inst$l8pop) ; <fold >
inst l8pop ; (): value in zmm0
overify TAG_LONG8
vmovdqu64 zmm0, [rsp]
pop4set
end_inst
end if ; </fold>
; </fold>
; <fold conversion>
if(used inst$l8tob8) ; <fold >
inst l8tob8
overify TAG_LONG8
vmovdqu64 zmm0, [rsp]
vpandq zmm0, zmm0, [l8.03]
vshufps zmm0, zmm0, zmm0, $d8
vshufi64x2 zmm0, zmm0, zmm0, $d8
vextracti64x4 ymm1, zmm0, $01
vpslldq ymm1, ymm1, $08
vpor ymm0, ymm0, ymm1
vextracti128 xmm1, ymm0, $01
vpackusdw xmm0, xmm0, xmm1
vpxor xmm1, xmm0, xmm0
vpackuswb xmm0, xmm0, xmm1
vmovdqa xword[rsp+$30], xmm0
pop3set TAG_BYTE8
end_inst
end if ; </fold>
if(used inst$l8tos8) ; <fold >
inst l8tos8
overify TAG_LONG8
vmovdqu64 zmm0, [rsp]
vpandq zmm0, zmm0, [l8.02]
vshufps zmm0, zmm0, zmm0, $d8
vshufi64x2 zmm0, zmm0, zmm0, $d8
vextracti64x4 ymm1, zmm0, $01
vpslldq ymm1, ymm1, $08
vpor ymm0, ymm0, ymm1
vextracti128 xmm1, ymm0, $01
vpackusdw xmm0, xmm0, xmm1
vmovdqa xword[rsp+$30], xmm0
pop3set TAG_SHORT8
end_inst
end if ; </fold>
if(used inst$l8toi8) ; <fold >
inst l8toi8
overify TAG_LONG8
vmovdqu64 zmm0, [rsp]
vpandq zmm0, zmm0, [l8.01]
vshufps zmm0, zmm0, zmm0, $d8
vshufi64x2 zmm0, zmm0, zmm0, $d8
vextracti64x4 ymm1, zmm0, $01
vpslldq ymm1, ymm1, $08
vpor ymm0, ymm0, ymm1
vmovdqu yword[rsp+$20], ymm0
pop2set TAG_INT8
end_inst
end if ; </fold>
if(used inst$l8tol) ; <fold >
inst l8tol
overify TAG_LONG8
vmovq xmm0, [rsp]
vmovdqa xword[rsp+$30], xmm0
pop3set TAG_LONG
end_inst
end if ; </fold>
if(used inst$l8tol2) ; <fold >
inst l8tol2
overify TAG_LONG8
vmovdqa xmm0, [rsp]
vmovdqa xword[rsp+$30], xmm0
pop3set TAG_LONG2
end_inst
end if ; </fold>
if(used inst$l8tol4) ; <fold >
inst l8tol4
overify TAG_LONG8
vmovdqu ymm0, [rsp]
vmovdqu yword[rsp+$20], ymm0
pop2set TAG_LONG4
end_inst
end if ; </fold>
if(used inst$l8tof8) ; <fold >
inst l8tof8
overify TAG_LONG8
vmovdqu64 zmm0, [rsp]
vcvtqq2ps ymm0, zmm0
vmovdqu yword[rsp+$20], ymm0
pop2set TAG_FLOAT8
end_inst
end if ; </fold>
if(used inst$l8tod8) ; <fold >
inst l8tod8
overify TAG_LONG8
vmovdqu64 zmm0, [rsp]
vcvtqq2pd zmm0, zmm0
vmovdqu64 zword[rsp], zmm0
set TAG_DOUBLE8
end_inst
end if ; </fold>
; </fold>
; <fold relation>
if(used inst$l8se) ; <fold >
inst l8se
overify TAG_LONG8, TAG_LONG8
vmovdqu64 zmm0, [rsp+$40]
vmovdqu64 zmm1, [rsp+$00]
vpcmpeqq k0, zmm0, zmm1
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$l8sne) ; <fold >
inst l8sne
overify TAG_LONG8, TAG_LONG8
vmovdqu64 zmm0, [rsp+$40]
vmovdqu64 zmm1, [rsp+$00]
vpcmpeqq k0, zmm0, zmm1
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 bitwise>
if(used inst$l8not) ; <fold >
inst l8not
overify TAG_LONG8
vmovdqu64 zmm0, [rsp]
vpxorq zmm0, zmm0, [l8.00]
vmovdqu64 zword[rsp], zmm0
end_inst
end if ; </fold>
if(used inst$l8and) ; <fold >
inst l8and
overify TAG_LONG8, TAG_LONG8
vmovdqu64 zmm0, [rsp+$40]
vmovdqu64 zmm1, [rsp+$00]
vpandq zmm0, zmm0, zmm1
vmovdqu64 zword[rsp+$40], zmm0
pop4set
end_inst
end if ; </fold>
if(used inst$l8or) ; <fold >
inst l8or
overify TAG_LONG8, TAG_LONG8
vmovdqu64 zmm0, [rsp+$40]
vmovdqu64 zmm1, [rsp+$00]
vporq zmm0, zmm0, zmm1
vmovdqu64 zword[rsp+$40], zmm0
pop4set
end_inst
end if ; </fold>
if(used inst$l8xor) ; <fold >
inst l8xor
overify TAG_LONG8, TAG_LONG8
vmovdqu64 zmm0, [rsp+$40]
vmovdqu64 zmm1, [rsp+$00]
vpxorq zmm0, zmm0, zmm1
vmovdqu64 zword[rsp+$40], zmm0
pop4set
end_inst
end if ; </fold>
; </fold>
; <fold scalar>
if(used inst$l8sneg | used inst$l8vneg) ; <fold >
inst l8sneg, l8vneg
overify TAG_LONG8
vmovdqu64 zmm0, [rsp]
vpxorq zmm1, zmm0, zmm0
vpsubq zmm0, zmm1, zmm0
vmovdqu64 zword[rsp], zmm0
end_inst
end if ; </fold>
if(used inst$l8smul) ; <fold >
inst l8smul
overify TAG_LONG8, TAG_LONG8
vmovdqu64 zmm0, [rsp+$40]
vmovdqu64 zmm1, [rsp+$00]
vshufi64x2 zmm8, zmm1, zmm1, $e4
vshufi64x2 zmm10, zmm8, zmm8, $b1
vshufi64x2 zmm12, zmm8, zmm8, $4e
vshufi64x2 zmm14, zmm8, zmm8, $1b
vshufpd zmm9, zmm8, zmm8, $55
vshufpd zmm11, zmm10, zmm10, $55
vshufpd zmm13, zmm12, zmm12, $55
vshufpd zmm15, zmm14, zmm14, $55
vpmullq zmm8, zmm8, [l8.o0]
vpmullq zmm9, zmm9, [l8.o1]
vpmullq zmm10, zmm10, [l8.o2]
vpmullq zmm11, zmm11, [l8.o3]
vpmullq zmm12, zmm12, [l8.o4]
vpmullq zmm13, zmm13, [l8.o5]
vpmullq zmm14, zmm14, [l8.o6]
vpmullq zmm15, zmm15, [l8.o7]
vpmullq zmm7, zmm0, zmm15
vpmullq zmm6, zmm0, zmm14
vpmullq zmm5, zmm0, zmm13
vpmullq zmm4, zmm0, zmm12
vpmullq zmm3, zmm0, zmm11
vpmullq zmm2, zmm0, zmm10
vpmullq zmm1, zmm0, zmm9
vpmullq zmm0, zmm0, zmm8
vextracti64x4 ymm8, zmm0, $01
vextracti64x4 ymm9, zmm1, $01
vextracti64x4 ymm10, zmm2, $01
vextracti64x4 ymm11, zmm3, $01
vextracti64x4 ymm12, zmm4, $01
vextracti64x4 ymm13, zmm5, $01
vextracti64x4 ymm14, zmm6, $01
vextracti64x4 ymm15, zmm7, $01
vinserti64x4 zmm0, zmm0, ymm2, $01
vinserti64x4 zmm2, zmm4, ymm6, $01
vinserti64x4 zmm4, zmm1, ymm3, $01
vinserti64x4 zmm6, zmm5, ymm7, $01
vinserti64x4 zmm1, zmm8, ymm10, $01
vinserti64x4 zmm3, zmm12, ymm14, $01
vinserti64x4 zmm5, zmm9, ymm11, $01
vinserti64x4 zmm7, zmm13, ymm15, $01
vpaddq zmm0, zmm0, zmm1
vpaddq zmm1, zmm2, zmm3
vpaddq zmm2, zmm4, zmm5
vpaddq zmm3, zmm6, zmm7
vshufi64x2 zmm4, zmm0, zmm1, $88
vshufi64x2 zmm5, zmm0, zmm1, $dd
vshufi64x2 zmm6, zmm2, zmm3, $88
vshufi64x2 zmm7, zmm2, zmm3, $dd
vpaddq zmm0, zmm4, zmm5
vpaddq zmm1, zmm6, zmm7
vshufpd zmm2, zmm0, zmm1, $00
vshufpd zmm3, zmm0, zmm1, $ff
vpaddq zmm0, zmm2, zmm3
vmovdqu64 zword[rsp+$40], zmm0
pop4set
end_inst
end if ; </fold>
if(used inst$l8sadd | used inst$l8vadd) ; <fold >
inst l8sadd, l8vadd
overify TAG_LONG8, TAG_LONG8
vmovdqu64 zmm0, [rsp+$40]
vmovdqu64 zmm1, [rsp+$00]
vpaddq zmm0, zmm0, zmm1
vmovdqu64 zword[rsp+$40], zmm0
pop4set
end_inst
end if ; </fold>
if(used inst$l8ssub | used inst$l8vsub) ; <fold >
inst l8ssub, l8vsub
overify TAG_LONG8, TAG_LONG8
vmovdqu64 zmm0, [rsp+$40]
vmovdqu64 zmm1, [rsp+$00]
vpsubq zmm0, zmm0, zmm1
vmovdqu64 zword[rsp+$40], zmm0
pop4set
end_inst
end if ; </fold>
if(used inst$l8ssar | used inst$l8vsar) ; <fold >
inst l8ssar, l8vsar
overify TAG_LONG8, TAG_INT
mov ecx, [rsp]
and ecx, $3f
vmovdqu64 zmm0, [rsp+$10]
vmovd xmm1, ecx
vpsraq zmm0, zmm0, xmm1
vmovdqu64 zword[rsp+$10], zmm0
pop1set
end_inst
end if ; </fold>
if(used inst$l8ssal | used inst$l8vsal) ; <fold >
inst l8ssal, l8vsal
overify TAG_LONG8, TAG_INT
mov ecx, [rsp]
and ecx, $3f
vmovdqu64 zmm0, [rsp+$10]
vmovd xmm1, ecx
vpsllq zmm0, zmm0, xmm1
vmovdqu64 zword[rsp+$10], zmm0
pop1set
end_inst
end if ; </fold>
if(used inst$l8sshr | used inst$l8vshr) ; <fold >
inst l8sshr, l8vshr
overify TAG_LONG8, TAG_INT
mov ecx, [rsp]
and ecx, $3f
vmovdqu64 zmm0, [rsp+$10]
vmovd xmm1, ecx
vpsrlq zmm0, zmm0, xmm1
vmovdqu64 zword[rsp+$10], zmm0
pop1set
end_inst
end if ; </fold>
; </fold>
; <fold vector>
if(used inst$l8vpack) ; <fold >
inst l8vpack
overify TAG_LONG8
vmovdqu64 zmm0, [rsp]
vpxorq zmm1, zmm0, zmm0
vpcmpgtq k1, zmm1, zmm0
vpcmpgtq k2, zmm0, [l8.01]
vmovdqa64 zmm2, [l8.00]
vmovdqa64 zmm1{k1}{z}, zmm2
vmovdqa64 zmm2{k2}{z}, zmm2
vpandnq zmm0, zmm1, zmm0
vporq zmm0, zmm2, zmm0
vshufps zmm0, zmm0, zmm0, $d8
vshufi64x2 zmm0, zmm0, zmm0, $d8
vextracti64x4 ymm1, zmm0, $01
vpand ymm0, ymm0, [i8.04]
vpslldq ymm1, ymm1, $08
vpor ymm0, ymm0, ymm1
vmovdqu yword[rsp+$20], ymm0
pop2set TAG_INT8
end_inst
end if ; </fold>
if(used inst$l8vmul) ; <fold >
inst l8vmul
overify TAG_LONG8, TAG_LONG8
vmovdqu64 zmm0, [rsp+$40]
vmovdqu64 zmm1, [rsp+$00]
vpmullq zmm0, zmm0, zmm1
vmovdqu64 zword[rsp+$40], zmm0
pop4set
end_inst
end if ; </fold>
if(used inst$l8vg) ; <fold >
inst l8vg
overify TAG_LONG8, TAG_LONG8
vmovdqu64 zmm0, [rsp+$40]
vmovdqu64 zmm1, [rsp+$00]
vpcmpgtq k1, zmm0, zmm1
vmovdqa64 zmm0{k1}{z}, [l8.00]
vmovdqu64 zword[rsp+$40], zmm0
pop4set
end_inst
end if ; </fold>
if(used inst$l8vge) ; <fold >
inst l8vge
overify TAG_LONG8, TAG_LONG8
vmovdqu64 zmm0, [rsp+$40]
vmovdqu64 zmm1, [rsp+$00]
vpcmpgtq k1, zmm1, zmm0
knotw k1, k1
vmovdqa64 zmm0{k1}{z}, [l8.00]
vmovdqu64 zword[rsp+$40], zmm0
pop4set
end_inst
end if ; </fold>
if(used inst$l8vl) ; <fold >
inst l8vl
overify TAG_LONG8, TAG_LONG8
vmovdqu64 zmm0, [rsp+$40]
vmovdqu64 zmm1, [rsp+$00]
vpcmpgtq k1, zmm1, zmm0
vmovdqa64 zmm0{k1}{z}, [l8.00]
vmovdqu64 zword[rsp+$40], zmm0
pop4set
end_inst
end if ; </fold>
if(used inst$l8vle) ; <fold >
inst l8vle
overify TAG_LONG8, TAG_LONG8
vmovdqu64 zmm0, [rsp+$40]
vmovdqu64 zmm1, [rsp+$00]
vpcmpgtq k1, zmm0, zmm1
knotw k1, k1
vmovdqa64 zmm0{k1}{z}, [l8.00]
vmovdqu64 zword[rsp+$40], zmm0
pop4set
end_inst
end if ; </fold>
if(used inst$l8ve) ; <fold >
inst l8ve
overify TAG_LONG8, TAG_LONG8
vmovdqu64 zmm0, [rsp+$40]
vmovdqu64 zmm1, [rsp+$00]
vpcmpeqq k1, zmm0, zmm1
vmovdqa64 zmm0{k1}{z}, [l8.00]
vmovdqu64 zword[rsp+$40], zmm0
pop4set
end_inst
end if ; </fold>
if(used inst$l8vne) ; <fold >
inst l8vne
overify TAG_LONG8, TAG_LONG8
vmovdqu64 zmm0, [rsp+$40]
vmovdqu64 zmm1, [rsp+$00]
vpcmpeqq k1, zmm0, zmm1
knotw k1, k1
vmovdqa64 zmm0{k1}{z}, [l8.00]
vmovdqu64 zword[rsp+$40], zmm0
pop4set
end_inst
end if ; </fold>
; </fold>