;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold avt.lang.Float8 — родной код>
if(used avt.lang.Float8$toInt8Bits$float8$) ; <fold returns int8>
fast avt.lang.Float8$toInt8Bits$float8$, \
value, float8
fenter
vmovdqu ymm0, [.value]
fcltag_y value
fleave
end if ; </fold>
if(used avt.lang.Float8$low$float8$) ; <fold returns float4>
fast avt.lang.Float8$low$float8$, \
value, float8
fenter
vmovdqa xmm0, [.value+$00]
fcltag_y value
fleave
end if ; </fold>
if(used avt.lang.Float8$high$float8$) ; <fold returns float4>
fast avt.lang.Float8$high$float8$, \
value, float8
fenter
vmovdqa xmm0, [.value+$10]
fcltag_y value
fleave
end if ; </fold>
if(used avt.lang.Float8$create$float4$float4$) ; <fold returns float8>
fast avt.lang.Float8$create$float4$float4$, \
value0, float4, \
value1, float4
fenter
vmovdqa xmm0, [.value0]
vinserti128 ymm0, ymm0, [.value1], $01
fleave
end if ; </fold>
if(used avt.lang.Float8$create$float2$float2$float2$float2$) ; <fold returns float8>
fast avt.lang.Float8$create$float2$float2$float2$float2$, \
value0, float2, \
value1, float2, \
value2, float2, \
value3, float2
fenter
vmovdqa xmm0, [.value0]
vmovdqa xmm1, [.value1]
vmovdqa xmm2, [.value2]
vmovdqa xmm3, [.value3]
vpslldq xmm1, xmm1, $08
vpslldq xmm3, xmm3, $08
vpor xmm0, xmm0, xmm1
vpor xmm2, xmm2, xmm3
vinserti128 ymm0, ymm0, xmm2, $01
fleave
end if ; </fold>
if(used avt.lang.Float8$max$float8$float8$) ; <fold returns float8>
fast avt.lang.Float8$max$float8$float8$, \
value0, float8, \
value1, float8
fenter
vmovdqu ymm0, [.value0]
vmovdqu ymm1, [.value1]
vmovdqa ymm6, [avt.lang.Float8$MASK_NOT_A_NUMBER]
vmovdqa ymm7, [avt.lang.Float8$MASK_NEGATIVE_ZERO]
vpand ymm2, ymm0, ymm6
vpand ymm3, ymm1, ymm6
vpor ymm4, ymm0, ymm1
vpor ymm4, ymm4, ymm7
vpcmpeqd msk1, ymm4, ymm7
vpcmpeqd msk2, ymm3, ymm6
vpcmpeqd msk3, ymm2, ymm6
korw msk2, msk2, msk3
korw msk3, msk1, msk2
knotw msk3, msk3
vpandd ymm2{k1}{z}, ymm0, ymm1
vpord ymm3{k2}{z}, ymm6, ymm7
vmaxps 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.Float8$min$float8$float8$) ; <fold returns float8>
fast avt.lang.Float8$min$float8$float8$, \
value0, float8, \
value1, float8
fenter
vmovdqu ymm0, [.value0]
vmovdqu ymm1, [.value1]
vmovdqa ymm6, [avt.lang.Float8$MASK_NOT_A_NUMBER]
vmovdqa ymm7, [avt.lang.Float8$MASK_NEGATIVE_ZERO]
vpand ymm2, ymm0, ymm6
vpand ymm3, ymm1, ymm6
vpor ymm4, ymm0, ymm1
vpor ymm4, ymm4, ymm7
vpcmpeqd msk1, ymm4, ymm7
vpcmpeqd msk2, ymm3, ymm6
vpcmpeqd msk3, ymm2, ymm6
korw msk2, msk2, msk3
korw msk3, msk1, msk2
knotw msk3, msk3
vpord ymm2{k1}{z}, ymm0, ymm1
vpord ymm3{k2}{z}, ymm6, ymm7
vminps 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.Float8$setElement$float8$int$float$) ; <fold returns float8>
fast avt.lang.Float8$setElement$float8$int$float$, \
value, float8, \
index, int, \
element, float
fenter
mov r01d, [.index]
cmp r01d, $08
jb @F
fthrow VectorIndexOutOfBoundsException
@@: mov r00d, [.element]
mov dword [.value+r01*4+$00], r00d
vmovdqu ymm0, [.value]
fcltag_y value
fleave
end if ; </fold>
; </fold>