;
; Исходный код среды исполнения ПВТ-ОО.
;
; Этот исходный код является частью проекта ПВТ-ОО.
;
; Copyright © 2021 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять её и/или
; изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она может быть полезна,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <http://www.gnu.org/licenses/>.
;
; <fold avt.lang.Float (natives)>
method avt.lang.Float$nextAfter$float$, \
value, float ; returns float <fold >
menter
lverify value, TAG_FLOAT
mov r0d, [.value]
cmp r0d, [avt.lang.Float$NEGATIVE_INFINITY]
jne @F
vmovd xmm0, [avt.lang.Float$NEGATIVE_MAX_VALUE]
jmp .L.RET
@@: cmp r0d, [avt.lang.Float$NEGATIVE_MIN_VALUE]
jne @F
mov r0d, avt.lang.Float$NEGATIVE_ZERO_BITS
vmovd xmm0, r0d
jmp .L.RET
@@: cmp r0d, avt.lang.Float$NEGATIVE_ZERO_BITS
jne @F
vpxor xmm0, xmm0, xmm0
jmp .L.RET
@@: mov r1d, r0d
sar r1d, $17
and r1d, $00ff
test r1d, r1d
jnz @F
mov r2d, $00000001
jmp .L.NXT
@@: cmp r1d, $17
jg @F
dec r1d
mov r2d, $00000001
shl r2d, r1b
jmp .L.NXT
@@: mov r2d, r1d
sub r2d, $17
shl r2d, $17
.L.NXT: test r0d, avt.lang.Float$NEGATIVE_ZERO_BITS
jz @F
test r0d, avt.lang.Float$SIGNIFICAND_MASK
jnz @F
vmovd xmm0, r0d
vmovd xmm1, r2d
vmovd xmm2, [avt.lang.Float$HALF]
vmulss xmm1, xmm1, xmm2
vaddss xmm0, xmm0, xmm1
jmp .L.RET
@@: vmovd xmm0, r0d
vmovd xmm1, r2d
vaddss xmm0, xmm0, xmm1
.L.RET: call inst$fpush
mleavex
eleave
; </fold>
method avt.lang.Float$nextBefore$float$, \
value, float ; returns float <fold >
menter
lverify value, TAG_FLOAT
mov r0d, [.value]
cmp r0d, [avt.lang.Float$POSITIVE_INFINITY]
jne @F
vmovd xmm0, [avt.lang.Float$MAX_VALUE]
jmp .L.RET
@@: test r0d, r0d
jnz @F
mov r0d, avt.lang.Float$NEGATIVE_ZERO_BITS
vmovd xmm0, r0d
jmp .L.RET
@@: mov r1d, r0d
sar r1d, $17
and r1d, $00ff
test r1d, r1d
jnz @F
mov r2d, $00000001
jmp .L.NXT
@@: cmp r1d, $17
jg @F
dec r1d
mov r2d, $00000001
shl r2d, r1b
jmp .L.NXT
@@: mov r2d, r1d
sub r2d, $17
shl r2d, $17
.L.NXT: test r0d, avt.lang.Float$NEGATIVE_ZERO_BITS
jnz @F
test r0d, avt.lang.Float$SIGNIFICAND_MASK
jnz @F
vmovd xmm0, r0d
vmovd xmm1, r2d
vmovd xmm2, [avt.lang.Float$HALF]
vmulss xmm1, xmm1, xmm2
vsubss xmm0, xmm0, xmm1
jmp .L.RET
@@: vmovd xmm0, r0d
vmovd xmm1, r2d
vsubss xmm0, xmm0, xmm1
.L.RET: call inst$fpush
mleavex
eleave
; </fold>
method avt.lang.Float$toIntBits$float$, \
value, float ; returns int <fold >
menter
lverify value, TAG_FLOAT
iload [.value]
mleaved
eleave
; </fold>
; </fold>