;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold avt.lang.Double4 — родной код>
if(used avt.lang.Double4$toLong4Bits$double4$) ; <fold returns long4>
fast avt.lang.Double4$toLong4Bits$double4$, \
value, double4
fenter
vmovdqu ymm0, [.value]
fcltag_y value
fleave
end if ; </fold>
if(used avt.lang.Double4$low$double4$) ; <fold returns double2>
fast avt.lang.Double4$low$double4$, \
value, double4
fenter
vmovdqa xmm0, [.value+$00]
fcltag_y value
fleave
end if ; </fold>
if(used avt.lang.Double4$high$double4$) ; <fold returns double2>
fast avt.lang.Double4$high$double4$, \
value, double4
fenter
vmovdqa xmm0, [.value+$10]
fcltag_y value
fleave
end if ; </fold>
if(used avt.lang.Double4$create$double2$double2$) ; <fold returns double4>
fast avt.lang.Double4$create$double2$double2$, \
value0, double2, \
value1, double2
fenter
vmovdqa xmm0, [.value0]
vinserti128 ymm0, ymm0, [.value1], $01
fleave
end if ; </fold>
if(used avt.lang.Double4$max$double4$double4$) ; <fold returns double4>
fast avt.lang.Double4$max$double4$double4$, \
value0, double4, \
value1, double4
fenter
vmovdqu ymm0, [.value0]
vmovdqu ymm1, [.value1]
vmovdqa ymm6, [avt.lang.Double8$MASK_NOT_A_NUMBER]
vmovdqa ymm7, [avt.lang.Double8$MASK_NEGATIVE_ZERO]
vpand ymm2, ymm0, ymm6
vpand ymm3, ymm1, ymm6
vpor ymm4, ymm0, ymm1
vpor ymm4, ymm4, ymm7
vpcmpeqq msk1, ymm4, ymm7
vpcmpeqq msk2, ymm3, ymm6
vpcmpeqq msk3, ymm2, ymm6
korw msk2, msk2, msk3
korw msk3, msk1, msk2
knotw msk3, msk3
vpandq ymm2{k1}{z}, ymm0, ymm1
vporq ymm3{k2}{z}, ymm6, ymm7
vmaxpd ymm5{k3}{z}, ymm0, ymm1
vpor ymm0, ymm2, ymm3
vpor ymm0, ymm0, ymm5
fcltag_y value0, value1
fleave
end if ; </fold>
if(used avt.lang.Double4$min$double4$double4$) ; <fold returns double4>
fast avt.lang.Double4$min$double4$double4$, \
value0, double4, \
value1, double4
fenter
vmovdqu ymm0, [.value0]
vmovdqu ymm1, [.value1]
vmovdqa ymm6, [avt.lang.Double8$MASK_NOT_A_NUMBER]
vmovdqa ymm7, [avt.lang.Double8$MASK_NEGATIVE_ZERO]
vpand ymm2, ymm0, ymm6
vpand ymm3, ymm1, ymm6
vpor ymm4, ymm0, ymm1
vpor ymm4, ymm4, ymm7
vpcmpeqq msk1, ymm4, ymm7
vpcmpeqq msk2, ymm3, ymm6
vpcmpeqq msk3, ymm2, ymm6
korw msk2, msk2, msk3
korw msk3, msk1, msk2
knotw msk3, msk3
vporq ymm2{k1}{z}, ymm0, ymm1
vporq ymm3{k2}{z}, ymm6, ymm7
vminpd ymm5{k3}{z}, ymm0, ymm1
vpor ymm0, ymm2, ymm3
vpor ymm0, ymm0, ymm5
fcltag_y value0, value1
fleave
end if ; </fold>
if(used avt.lang.Double4$setElement$double4$int$double$) ; <fold returns double4>
fast avt.lang.Double4$setElement$double4$int$double$, \
value, double4, \
index, int, \
element, double
fenter
mov r01d, [.index]
cmp r01d, $04
jb @F
fthrow VectorIndexOutOfBoundsException
@@: mov r00q, [.element]
mov qword [.value+r01*8+$00], r00q
vmovdqu ymm0, [.value]
fcltag_y value
fleave
end if ; </fold>
; </fold>