;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold avt.lang.Float — родной код>
if(used avt.lang.Float$toIntBits$float$) ; <fold returns int>
fast avt.lang.Float$toIntBits$float$, \
value, float
fenter
mov r00d, [.value]
fleave
end if ; </fold>
if(used avt.lang.Float$nextAfter$float$) ; <fold returns float>
fast avt.lang.Float$nextAfter$float$, \
value, float
fenter
mov r00d, [.value]
vmovd xmm0, r00d
; не-число
vcomiss xmm0, xmm0
jnp @F
freturn
@@: ; –∞
vcomiss xmm0, [avt.lang.Float$NEGATIVE_INFINITY]
jne @F
vmovd xmm0, [avt.lang.Float$NEGATIVE_MAX_VALUE]
freturn
@@: ; –MIN_VALUE
cmp r00d, [avt.lang.Float$NEGATIVE_MIN_VALUE]
jne @F
vmovd xmm0, [avt.lang.Float$NEGATIVE_ZERO]
freturn
@@: ; –0
cmp r00d, [avt.lang.Float$NEGATIVE_ZERO]
jne @F
vpxor xmm0, xmm0, xmm0
freturn
@@: ; остальные значения
mov r01d, r00d
sar r01d, $17
and r01d, $00ff
test r01d, r01d
jnz .L.0000
mov r02d, $01
jmp .L.0002
.L.0000: cmp r01d, $17
jg .L.0001
lea r01d, [r01d-$01]
mov r02d, $01
shl r02d, r01b
jmp .L.0002
.L.0001: lea r02d, [r01d-$17]
shl r02d, $17
.L.0002: test r00d, avt.lang.Float$NEGATIVE_ZERO_BITS
jz .L.0003
test r00d, avt.lang.Float$SIGNIFICAND_MASK
jnz .L.0003
vmovd xmm1, r02d
vmulss xmm1, xmm1, [avt.lang.Float$HALF]
vaddss xmm0, xmm0, xmm1
freturn
.L.0003: vmovd xmm1, r02d
vaddss xmm0, xmm0, xmm1
fleave
end if ; </fold>
if(used avt.lang.Float$nextBefore$float$) ; <fold returns float>
fast avt.lang.Float$nextBefore$float$, \
value, float
fenter
mov r00d, [.value]
vmovd xmm0, r00d
; не-число
vcomiss xmm0, xmm0
jnp @F
freturn
@@: ; +∞
vcomiss xmm0, [avt.lang.Float$POSITIVE_INFINITY]
jne @F
vmovd xmm0, [avt.lang.Float$MAX_VALUE]
freturn
@@: ; +MIN_VALUE
cmp r00d, [avt.lang.Float$MIN_VALUE]
jne @F
vpxor xmm0, xmm0, xmm0
freturn
@@: ; +0
cmp r00d, $00
jne @F
vmovd xmm0, [avt.lang.Float$NEGATIVE_ZERO]
freturn
@@: ; остальные значения
mov r01d, r00d
sar r01d, $17
and r01d, $00ff
test r01d, r01d
jnz .L.0000
mov r02d, $01
jmp .L.0002
.L.0000: cmp r01d, $17
jg .L.0001
lea r01d, [r01d-$01]
mov r02d, $01
shl r02d, r01b
jmp .L.0002
.L.0001: lea r02d, [r01d-$17]
shl r02d, $17
.L.0002: test r00d, avt.lang.Float$NEGATIVE_ZERO_BITS
jnz .L.0003
test r00d, avt.lang.Float$SIGNIFICAND_MASK
jnz .L.0003
vmovd xmm1, r02d
vmulss xmm1, xmm1, [avt.lang.Float$HALF]
vsubss xmm0, xmm0, xmm1
freturn
.L.0003: vmovd xmm1, r02d
vsubss xmm0, xmm0, xmm1
fleave
end if ; </fold>
; </fold>