;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold векторная упаковка>
if(used inst$vpcks) ; <fold returns byte>
proc inst$vpcks
mov dsc1, dsc0
sar dsc1, $08
cmp dsc1, $00
je .L.0001
jg .L.0000
mov dsc0, $00000000
ret
.L.0000: mov dsc0, $ffffffff
ret
.L.0001: movsx dsc0, bsc0
ret
end_proc
end if ; </fold>
if(used inst$vpcki) ; <fold returns short>
proc inst$vpcki
mov dsc1, dsc0
sar dsc1, $10
cmp dsc1, $00
je .L.0001
jg .L.0000
mov dsc0, $00000000
ret
.L.0000: mov dsc0, $ffffffff
ret
.L.0001: movsx dsc0, wsc0
ret
end_proc
end if ; </fold>
if(used inst$vpckl) ; <fold returns int>
proc inst$vpckl
mov qsc1, qsc0
sar qsc1, $20
cmp qsc1, $00
je .L.0001
jg .L.0000
mov dsc0, $00000000
ret
.L.0000: mov dsc0, $ffffffff
.L.0001: ret
end_proc
end if ; </fold>
if(used inst$vpckl2) ; <fold returns int2>
proc inst$vpckl2
vpxor xmm1, xmm0, xmm0
vpcmpgtq xmm1, xmm1, xmm0
vpcmpgtq xmm2, xmm0, [cons$long8.maskd]
vpandn xmm0, xmm1, xmm0
vpor xmm0, xmm2, xmm0
vshufps xmm0, xmm0, xmm0, $d8
vpand xmm0, xmm0, [cons$int8.m1_0]
ret
end_proc
end if ; </fold>
if(used inst$vpckl4) ; <fold returns int4>
proc inst$vpckl4
vpxor ymm1, ymm0, ymm0
vpcmpgtq ymm1, ymm1, ymm0
vpcmpgtq ymm2, ymm0, [cons$long8.maskd]
vpandn ymm0, ymm1, ymm0
vpor ymm0, ymm2, ymm0
vshufps ymm0, ymm0, ymm0, $d8
vextracti128 xmm1, ymm0, $01
vpand xmm0, xmm0, [cons$int8.m1_0]
vpslldq xmm1, xmm1, $08
vpor xmm0, xmm0, xmm1
ret
end_proc
end if ; </fold>
if(used inst$vpckl8) ; <fold returns int8>
proc inst$vpckl8
vpxorq zmm1, zmm0, zmm0
vpcmpgtq msk1, zmm1, zmm0
vpcmpgtq msk2, zmm0, [cons$long8.maskd]
vmovdqa64 zmm2, [cons$long8.m1]
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, [cons$int8.m1_0]
vpslldq ymm1, ymm1, $08
vpor ymm0, ymm0, ymm1
ret
end_proc
end if ; </fold>
; </fold>