;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold avt.lang.Double8 — родной код>
if(used avt.lang.Double8$toLong8Bits$double8$) ; <fold returns long8>
fast avt.lang.Double8$toLong8Bits$double8$, \
value, double8
fenter
vmovdqu64 zmm0, [.value]
fcltag_z value
fleave
end if ; </fold>
if(used avt.lang.Double8$low$double8$) ; <fold returns double4>
fast avt.lang.Double8$low$double8$, \
value, double8
fenter
vmovdqu ymm0, [.value+$00]
fcltag_z value
fleave
end if ; </fold>
if(used avt.lang.Double8$high$double8$) ; <fold returns double4>
fast avt.lang.Double8$high$double8$, \
value, double8
fenter
vmovdqu ymm0, [.value+$20]
fcltag_z value
fleave
end if ; </fold>
if(used avt.lang.Double8$create$double4$double4$) ; <fold returns double8>
fast avt.lang.Double8$create$double4$double4$, \
value0, double4, \
value1, double4
fenter
vmovdqu ymm0, [.value0]
vmovdqu ymm1, [.value1]
vinserti64x4 zmm0, zmm0, ymm1, $01
fcltag_y value0, value1
fleave
end if ; </fold>
if(used avt.lang.Double8$create$double2$double2$double2$double2$) ; <fold returns double8>
fast avt.lang.Double8$create$double2$double2$double2$double2$, \
value0, double2, \
value1, double2, \
value2, double2, \
value3, double2
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.Double8$max$double8$double8$) ; <fold returns double8>
fast avt.lang.Double8$max$double8$double8$, \
value0, double8, \
value1, double8
fenter
vmovdqu64 zmm0, [.value0]
vmovdqu64 zmm1, [.value1]
vmovdqa64 zmm6, [avt.lang.Double8$MASK_NOT_A_NUMBER]
vmovdqa64 zmm7, [avt.lang.Double8$MASK_NEGATIVE_ZERO]
vpandq zmm2, zmm0, zmm6
vpandq zmm3, zmm1, zmm6
vporq zmm4, zmm0, zmm1
vporq zmm4, zmm4, zmm7
vpcmpeqq msk1, zmm4, zmm7
vpcmpeqq msk2, zmm3, zmm6
vpcmpeqq msk3, zmm2, zmm6
korw msk2, msk2, msk3
korw msk3, msk1, msk2
knotw msk3, msk3
vpandq zmm2{k1}{z}, zmm0, zmm1
vporq zmm3{k2}{z}, zmm6, zmm7
vmaxpd zmm5{k3}{z}, zmm0, zmm1
vporq zmm0, zmm2, zmm3
vporq zmm0, zmm0, zmm5
fcltag_z value0, value1
fleave
end if ; </fold>
if(used avt.lang.Double8$min$double8$double8$) ; <fold returns double8>
fast avt.lang.Double8$min$double8$double8$, \
value0, double8, \
value1, double8
fenter
vmovdqu64 zmm0, [.value0]
vmovdqu64 zmm1, [.value1]
vmovdqa64 zmm6, [avt.lang.Double8$MASK_NOT_A_NUMBER]
vmovdqa64 zmm7, [avt.lang.Double8$MASK_NEGATIVE_ZERO]
vpandq zmm2, zmm0, zmm6
vpandq zmm3, zmm1, zmm6
vporq zmm4, zmm0, zmm1
vporq zmm4, zmm4, zmm7
vpcmpeqq msk1, zmm4, zmm7
vpcmpeqq msk2, zmm3, zmm6
vpcmpeqq msk3, zmm2, zmm6
korw msk2, msk2, msk3
korw msk3, msk1, msk2
knotw msk3, msk3
vporq zmm2{k1}{z}, zmm0, zmm1
vporq zmm3{k2}{z}, zmm6, zmm7
vminpd zmm5{k3}{z}, zmm0, zmm1
vporq zmm0, zmm2, zmm3
vporq zmm0, zmm0, zmm5
fcltag_z value0, value1
fleave
end if ; </fold>
if(used avt.lang.Double8$setElement$double8$int$double$) ; <fold returns double8>
fast avt.lang.Double8$setElement$double8$int$double$, \
value, double8, \
index, int, \
element, double
fenter
mov r01d, [.index]
cmp r01d, $08
jb @F
fthrow VectorIndexOutOfBoundsException
@@: mov r00q, [.element]
mov qword [.value+r01*8+$00], r00q
vmovdqu64 zmm0, [.value]
fcltag_z value
fleave
end if ; </fold>
; </fold>