;
; Исходный код среды исполнения ПВТ-ОО.
;
; Этот исходный код является частью проекта ПВТ-ОО.
;
; Copyright © 2021 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять её и/или
; изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она может быть полезна,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <http://www.gnu.org/licenses/>.
;
; <fold avt.lang.Double (natives)>
method avt.lang.Double$nextAfter$double$, \
value, double ; returns double <fold >
menter
lverify value, TAG_DOUBLE
mov r0, [.value]
cmp r0, [avt.lang.Double$NEGATIVE_INFINITY]
jne @F
vmovq xmm0, [avt.lang.Double$NEGATIVE_MAX_VALUE]
jmp .L.RET
@@: cmp r0, [avt.lang.Double$NEGATIVE_MIN_VALUE]
jne @F
vmovq xmm0, [avt.lang.Double$NEGATIVE_ZERO_BITS]
jmp .L.RET
@@: cmp r0, [avt.lang.Double$NEGATIVE_ZERO_BITS]
jne @F
vpxor xmm0, xmm0, xmm0
jmp .L.RET
@@: mov r1, r0
sar r1, $34
and r1, $07ff
test r1, r1
jnz @F
mov r2d, $00000001
jmp .L.NXT
@@: cmp r1, $34
jg @F
dec r1
mov r2d, $00000001
shl r2, r1b
jmp .L.NXT
@@: mov r2, r1
sub r2, $34
shl r2, $34
.L.NXT: test r0, [avt.lang.Double$NEGATIVE_ZERO_BITS]
jz @F
test r0, [avt.lang.Double$SIGNIFICAND_MASK]
jnz @F
vmovq xmm0, r0
vmovq xmm1, r2
vmovq xmm2, [avt.lang.Double$HALF]
vmulsd xmm1, xmm1, xmm2
vaddsd xmm0, xmm0, xmm1
jmp .L.RET
@@: vmovq xmm0, r0
vmovq xmm1, r2
vaddsd xmm0, xmm0, xmm1
.L.RET: call inst$dpush
mleavex
eleave
; </fold>
method avt.lang.Double$nextBefore$double$, \
value, double ; returns double <fold >
menter
lverify value, TAG_DOUBLE
mov r0, [.value]
cmp r0, [avt.lang.Double$POSITIVE_INFINITY]
jne @F
vmovq xmm0, [avt.lang.Double$MAX_VALUE]
jmp .L.RET
@@: test r0, r0
jnz @F
vmovq xmm0, [avt.lang.Double$NEGATIVE_ZERO_BITS]
jmp .L.RET
@@: mov r1, r0
sar r1, $34
and r1, $07ff
test r1, r1
jnz @F
mov r2d, $00000001
jmp .L.NXT
@@: cmp r1, $34
jg @F
dec r1
mov r2d, $00000001
shl r2, r1b
jmp .L.NXT
@@: mov r2, r1
sub r2, $34
shl r2, $34
.L.NXT: test r0, [avt.lang.Double$NEGATIVE_ZERO_BITS]
jnz @F
test r0, [avt.lang.Double$SIGNIFICAND_MASK]
jnz @F
vmovq xmm0, r0
vmovq xmm1, r2
vmovq xmm2, [avt.lang.Double$HALF]
vmulsd xmm1, xmm1, xmm2
vsubsd xmm0, xmm0, xmm1
jmp .L.RET
@@: vmovq xmm0, r0
vmovq xmm1, r2
vsubsd xmm0, xmm0, xmm1
.L.RET: call inst$dpush
mleavex
eleave
; </fold>
method avt.lang.Double$toLongBits$double$, \
value, double ; returns long <fold >
menter
lverify value, TAG_DOUBLE
lload [.value]
mleaveq
eleave
; </fold>
; </fold>