;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold avt.lang.Long8 — родной код>
if(used avt.lang.Long8$low$long8$) ; <fold returns long4>
fast avt.lang.Long8$low$long8$, \
value, long8
fenter
vmovdqu ymm0, [.value+$00]
fcltag_z value
fleave
end if ; </fold>
if(used avt.lang.Long8$high$long8$) ; <fold returns long4>
fast avt.lang.Long8$high$long8$, \
value, long8
fenter
vmovdqu ymm0, [.value+$20]
fcltag_z value
fleave
end if ; </fold>
if(used avt.lang.Long8$create$long4$long4$) ; <fold returns long8>
fast avt.lang.Long8$create$long4$long4$, \
value0, long4, \
value1, long4
fenter
vmovdqu ymm0, [.value0]
vmovdqu ymm1, [.value1]
vinserti64x4 zmm0, zmm0, ymm1, $01
fcltag_y value0, value1
fleave
end if ; </fold>
if(used avt.lang.Long8$create$long2$long2$long2$long2$) ; <fold returns long8>
fast avt.lang.Long8$create$long2$long2$long2$long2$, \
value0, long2, \
value1, long2, \
value2, long2, \
value3, long2
fenter
vmovdqa xmm0, [.value0]
vinserti64x2 zmm0, zmm0, [.value1], $01
vinserti64x2 zmm0, zmm0, [.value2], $02
vinserti64x2 zmm0, zmm0, [.value3], $03
fleave
end if ; </fold>
if(used avt.lang.Long8$max$long8$long8$) ; <fold returns long8>
fast avt.lang.Long8$max$long8$long8$, \
value0, long8, \
value1, long8
fenter
vmovdqu64 zmm0, [.value0]
vmovdqu64 zmm1, [.value1]
vpmaxsq zmm0, zmm0, zmm1
fcltag_z value0, value1
fleave
end if ; </fold>
if(used avt.lang.Long8$maxUnsigned$long8$long8$) ; <fold returns long8>
fast avt.lang.Long8$maxUnsigned$long8$long8$, \
value0, long8, \
value1, long8
fenter
vmovdqu64 zmm0, [.value0]
vmovdqu64 zmm1, [.value1]
vpmaxuq zmm0, zmm0, zmm1
fcltag_z value0, value1
fleave
end if ; </fold>
if(used avt.lang.Long8$min$long8$long8$) ; <fold returns long8>
fast avt.lang.Long8$min$long8$long8$, \
value0, long8, \
value1, long8
fenter
vmovdqu64 zmm0, [.value0]
vmovdqu64 zmm1, [.value1]
vpminsq zmm0, zmm0, zmm1
fcltag_z value0, value1
fleave
end if ; </fold>
if(used avt.lang.Long8$minUnsigned$long8$long8$) ; <fold returns long8>
fast avt.lang.Long8$minUnsigned$long8$long8$, \
value0, long8, \
value1, long8
fenter
vmovdqu64 zmm0, [.value0]
vmovdqu64 zmm1, [.value1]
vpminuq zmm0, zmm0, zmm1
fcltag_z value0, value1
fleave
end if ; </fold>
if(used avt.lang.Long8$rotateLeft$long8$int$) ; <fold returns long8>
fast avt.lang.Long8$rotateLeft$long8$int$, \
value, long8, \
bits, int
fenter
mov r01d, [.bits]
and r01d, $3f
mov r02d, $40
sub r02d, r01d
vmovdqu64 zmm1, [.value]
vmovd xmm2, r01d
vmovd xmm3, r02d
vpsllq zmm0, zmm1, xmm2
vpsrlq zmm1, zmm1, xmm3
vpor zmm0, zmm0, zmm1
fcltag_z value
fleave
end if ; </fold>
if(used avt.lang.Long8$rotateRight$long8$int$) ; <fold returns long8>
fast avt.lang.Long8$rotateRight$long8$int$, \
value, long8, \
bits, int
fenter
mov r01d, [.bits]
and r01d, $3f
mov r02d, $40
sub r02d, r01d
vmovdqu64 zmm1, [.value]
vmovd xmm2, r01d
vmovd xmm3, r02d
vpsrlq zmm0, zmm1, xmm2
vpsllq zmm1, zmm1, xmm3
vpor zmm0, zmm0, zmm1
fcltag_z value
fleave
end if ; </fold>
if(used avt.lang.Long8$setElement$long8$int$long$) ; <fold returns long8>
fast avt.lang.Long8$setElement$long8$int$long$, \
value, long8, \
index, int, \
element, long
fenter
mov r01d, [.index]
cmp r01d, $08
jl @F
fthrow VectorIndexOutOfBoundsException
@@: mov r00q, [.element]
mov qword [.value+r01*8+$00], r00q
vmovdqu64 zmm0, [.value]
fcltag_z value
fleave
end if ; </fold>
if(used avt.lang.Long8$toDouble8Bits$long8$) ; <fold returns double8>
fast avt.lang.Long8$toDouble8Bits$long8$, \
value, long8
fenter
vmovdqu64 zmm0, [.value]
fcltag_z value
fleave
end if ; </fold>
; </fold>