;
; Исходный код среды исполнения ПВТ-ОО.
;
; Этот исходный код является частью проекта ПВТ-ОО.
;
; Copyright © 2021 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять её и/или
; изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она может быть полезна,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <http://www.gnu.org/licenses/>.
;
; <fold push/pop/peek>
if(used inst$xpush) ; <fold >
inst xpush ; (value in st0)
push1
mov qword[rsp+$08], $00
fstp tbyte[rsp+$00]
set TAG_REAL
end_inst
end if ; </fold>
if(used inst$xpop) ; <fold >
inst xpop ; (): value in st0
overify TAG_REAL
fld tbyte[rsp]
pop1set
end_inst
end if ; </fold>
; </fold>
; <fold conversion>
if(used inst$xtoi) ; <fold >
inst xtoi
overify TAG_REAL
fld tbyte[rsp]
ficom dword[i.00] ; $7fffffff
fnstsw ax
shr ax, $08
pushfq
mov byte[rsp], al
popfq
jnp @F
ffree st0
fincstp
xor eax, eax
jmp .L.RET
@@: jbe @F
ffree st0
fincstp
mov eax, $7fffffff
jmp .L.RET
@@: fisttp dword[rsp]
mov eax, [rsp]
.L.RET: mov qword[rsp+$08], $00
mov qword[rsp+$00], rax
set TAG_INT
end_inst
end if ; </fold>
if(used inst$xtol) ; <fold >
inst xtol
overify TAG_REAL
fld tbyte[rsp]
fild qword[l.02] ; $7fffffffffffffff
fcomp
fnstsw ax
shr ax, $08
pushfq
mov byte[rsp], al
popfq
jnp @F
ffree st0
fincstp
xor rax, rax
jmp .L.RET
@@: ja @F
ffree st0
fincstp
mov rax, [l.02] ; $7fffffffffffffff
jmp .L.RET
@@: fisttp qword[rsp]
mov rax, [rsp]
.L.RET: mov qword[rsp+$08], $00
mov qword[rsp+$00], rax
set TAG_LONG
end_inst
end if ; </fold>
if(used inst$xtof) ; <fold >
inst xtof
overify TAG_REAL
fld tbyte[rsp]
mov qword[rsp+$08], $00
mov dword[rsp+$04], $00
fstp dword[rsp+$00]
set TAG_FLOAT
end_inst
end if ; </fold>
if(used inst$xtod) ; <fold >
inst xtod
overify TAG_REAL
fld tbyte[rsp]
mov qword[rsp+$08], $00
fstp qword[rsp+$00]
set TAG_DOUBLE
end_inst
end if ; </fold>
; </fold>
; <fold relation>
if(used inst$xcmpg) ; <fold >
inst xcmpg
overify TAG_REAL, TAG_REAL
fld tbyte[rsp+$00]
fld tbyte[rsp+$10]
fcomip st0, st1
ffree st0
fincstp
jp .G
jc .L
jz .E
.G: mov eax, $01
jmp @F
.L: mov eax, -$01
jmp @F
.E: xor eax, eax
@@: mov qword[rsp+$18], $00
mov qword[rsp+$10], rax
pop1set TAG_INT
end_inst
end if ; </fold>
if(used inst$xcmpl) ; <fold >
inst xcmpl
overify TAG_REAL, TAG_REAL
fld tbyte[rsp+$00]
fld tbyte[rsp+$10]
fcomip st0, st1
ffree st0
fincstp
jp .L
jc .L
jz .E
mov eax, $01
jmp @F
.L: mov eax, -$01
jmp @F
.E: xor eax, eax
@@: mov qword[rsp+$18], $00
mov qword[rsp+$10], rax
pop1set TAG_INT
end_inst
end if ; </fold>
; </fold>
; <fold scalar>
if(used inst$xsneg) ; <fold >
inst xsneg
overify TAG_REAL
fld tbyte[rsp]
fchs
fstp tbyte[rsp]
end_inst
end if ; </fold>
if(used inst$xsmul) ; <fold >
inst xsmul
overify TAG_REAL, TAG_REAL
fld tbyte[rsp+$10]
fld tbyte[rsp+$00]
fmulp st1, st0
fstp tbyte[rsp+$10]
pop1set
end_inst
end if ; </fold>
if(used inst$xsdiv | used inst$xsdivu) ; <fold >
inst xsdiv, xsdivu
overify TAG_REAL, TAG_REAL
fld tbyte[rsp+$10]
fld tbyte[rsp+$00]
fdivp st1, st0
fstp tbyte[rsp+$10]
pop1set
end_inst
end if ; </fold>
if(used inst$xsrem | used inst$xsremu) ; <fold >
inst xsrem, xsremu
overify TAG_REAL, TAG_REAL
fld tbyte[rsp+$00]
fld tbyte[rsp+$10]
@@: fprem
fnstsw ax
test ax, $0400
jnz @B
fstp st1
fstp tbyte[rsp+$10]
pop1set
end_inst
end if ; </fold>
if(used inst$xsadd) ; <fold >
inst xsadd
overify TAG_REAL, TAG_REAL
fld tbyte[rsp+$10]
fld tbyte[rsp+$00]
faddp st1, st0
fstp tbyte[rsp+$10]
pop1set
end_inst
end if ; </fold>
if(used inst$xssub) ; <fold >
inst xssub
overify TAG_REAL, TAG_REAL
fld tbyte[rsp+$10]
fld tbyte[rsp+$00]
fsubp st1, st0
fstp tbyte[rsp+$10]
pop1set
end_inst
end if ; </fold>
; </fold>