;
; Исходный код среды исполнения ПВТ-ОО.
;
; Этот исходный код является частью проекта ПВТ-ОО.
;
; Copyright © 2021 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять её и/или
; изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она может быть полезна,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <http://www.gnu.org/licenses/>.
;
; <fold push/pop/peek>
if(used inst$rpush) ; <fold >
inst rpush ; (value in rax)
push1
test rax, rax
jz @F
lock inc qword[rax+avt.lang.Object$fldRefCountFromOthers]
@@: mov qword[rsp+$08], $00
mov qword[rsp+$00], rax
set TAG_OBJECT
end_inst
end if ; </fold>
if(used inst$rpushnull) ; <fold >
inst rpushnull
push1
mov qword[rsp+$08], $00
mov qword[rsp+$00], null ; $00
set TAG_OBJECT
end_inst
end if ; </fold>
if(used inst$rpop) ; <fold >
inst rpop ; (): value in rax
overify TAG_OBJECT
mov rax, [rsp]
pop1set
end_inst
end if ; </fold>
; </fold>
; <fold pull>
if(used inst$rpull1) ; <fold >
inst rpull1 ; (instance in rax)
push1
test rax, rax
jz @F
lock inc qword[rax+avt.lang.Object$fldRefCountFromOthers]
@@: mov ch, TAG_OBJECT
mov cl, [rsi+$01]
mov rdx, [rsp+$10]
mov qword[rsp+$18], $00
mov qword[rsp+$10], rax
mov qword[rsp+$08], $00
mov qword[rsp+$00], rdx
mov word[rsi], cx
end_inst
end if ; </fold>
; </fold>
; <fold throw>
if(used inst$rthrow) ; <fold >
inst rthrow
overify TAG_OBJECT
mov rax, [rsp]
test rax, rax
jnz @F
throw NullPointerException
@@: pop1set
mov rcx, [rbx+context$irp]
jmp qword[rbx+context$ehp]
end if ; </fold>
; </fold>
; <fold relation>
if(used inst$re) ; <fold >
inst re
overify TAG_OBJECT, TAG_OBJECT
mov rcx, [rsp+$10]
mov rdx, [rsp+$00]
cmp rcx, rdx
sete al
movzx rax, al
test rcx, rcx
jz @F
lock dec qword[rcx+avt.lang.Object$fldRefCountFromOthers]
@@: test rdx, rdx
jz @F
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
@@: mov qword[rsp+$10], rax
pop1set TAG_INT
end_inst
end if ; </fold>
if(used inst$rne) ; <fold >
inst rne
overify TAG_OBJECT, TAG_OBJECT
mov rcx, [rsp+$10]
mov rdx, [rsp+$00]
cmp rcx, rdx
setne al
movzx rax, al
test rcx, rcx
jz @F
lock dec qword[rcx+avt.lang.Object$fldRefCountFromOthers]
@@: test rdx, rdx
jz @F
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
@@: mov qword[rsp+$10], rax
pop1set TAG_INT
end_inst
end if ; </fold>
if(used inst$risnull) ; <fold >
inst risnull
overify TAG_OBJECT
mov rcx, [rsp]
test rcx, rcx
setz al
jz @F
lock dec qword[rcx+avt.lang.Object$fldRefCountFromOthers]
@@: movzx rax, al
mov qword[rsp+$00], rax
set TAG_INT
end_inst
end if ; </fold>
if(used inst$risnotnull) ; <fold >
inst risnotnull
overify TAG_OBJECT
mov rcx, [rsp]
test rcx, rcx
setnz al
jz @F
lock dec qword[rcx+avt.lang.Object$fldRefCountFromOthers]
@@: movzx rax, al
mov qword[rsp+$00], rax
set TAG_INT
end_inst
end if ; </fold>
; </fold>